123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613 |
- <?php
- require_once(DRUPAL_ROOT . '/sites/all/libraries/twitter-api-php/TwitterAPIExchange.php');
- function twit_submit_libraries_info() {
- $libraries['twitter-api-php'] = array(
- 'name' => 'Twitter API Exchange',
- 'vendor url' => 'https://github.com/J7mbo/twitter-api-php',
- 'files' => array(
- 'php' => array('TwitterAPIExchange.php'), //this can be a path to the file location like array('lib/simple.js')
- ),
- );
- return $libraries;
- }
- /**
- *Add new hashtag to taxonomy as hashtag vocabulary type
- */
- function twit_submit_block_taxonomy_add($term) {
- $taxTerm = new stdClass();
- $taxTerm->name = $term;
- $taxTerm->vid = 6;
- taxonomy_term_save($taxTerm);
- return $taxTerm->tid;
- }
- /**
- *Check to see if hashtag is already in taxonomy before adding
- */
- function twit_submit_block_taxonomy_check($term) {
- $query = db_select('taxonomy_term_data', 'ttd')
- ->fields('ttd', array('tid', 'name'))
- ->condition('ttd.name', $term->text);
- $query = db_query('SELECT tid FROM taxonomy_term_data WHERE name = :name', array(
- ':name' => $term->text)
- );
- if ($query->rowCount() >= 2) {
- dpm($query->rowCount());
- $result = $query->fetchObject();
- dpm($result);
- $tid = $result->tid;
- } else {
- $tid = twit_submit_block_taxonomy_add($term->text);
- }
- return $tid;
- }
- /**
- *Update tracking of hashtag trends
- */
- function twithash_block_update($hashArray, $unixtime, $uid, $ip, $tweetId = NULL, $location = NULL) {
- $tmid = null;
- if ($location == NULL) {
- if ($ip == '127.0.0.1') {
- $geo = 1;
- } else {
- $geo = 1;
- }//Handling of non-local IPs to be added later
- } else {
- $checkLocQuery = db_query(
- ' SELECT id FROM twithash_geo
- WHERE country = :country
- AND city = :city
- AND region = :region',
- array(
- ':country' => 'Canada',
- ':city' => $location->city,
- ':region' => $location->province,
- )
- );
- $locResult = $checkLocQuery->fetchAll();
- if ($checkLocQuery->rowCount() > 0) {
- $geo = $locResult[0]->id;
- } else {
- $locInsert = db_insert('twithash_geo')
- ->fields(array(
- 'country' => 'Canada',
- 'city' => $location->city,
- 'region' => $location->province,
- ));
- $locId = $locInsert->execute();
- if ($locId != NULL && $locId > 0) {
- $geo = $locId;
- }
- }
- }
- $count = count($hashArray);
- //Populate twithash_term table with new terms or update number of hits for recurring terms. Simultaneously update twithash_term_update table which
- //tracks specific dates for each time a given term is searched.
- for ($i = 0; $i<$count; $i++) {
- $keyword = $hashArray[$i];
- $transaction = db_transaction();
- try{
- $tID = db_query('insert into twithash_term (term, hits, start) values (:term, 1, :start) on DUPLICATE KEY UPDATE hits = hits + :hits',
- array(
- ':term' => $keyword,
- ':start' => $unixtime,
- ':hits' => 1
- ),
- array('return' => Database::RETURN_INSERT_ID));
- //Insert IDs are collected for use in the query_master table, which tracks which different terms were compared up to a maximum
- //of 5 terms (the maximum allowed by Google Trends)
- if ($tID != 0)
- db_insert('twithash_term_update')
- ->fields(array(
- 't_id' => $tID,
- 'hit_time' => $unixtime
- ))
- ->execute();
- $tIDs[] = $tID;
- }
- catch (Exception $e) {
- $transaction->rollback();
- throw $e;
- }
- }
- $numTerms = isset($tIDs) ? count($tIDs) : 0;//Get number of terms in query
- switch ($numTerms) {//add overall query to twithash_master
- case 0:
- break;
- case 1:
- $tmid = db_query('
- INSERT INTO twithash_master (uid, query_date, geo, source, tid_1) VALUES (:uid, :query_date, :geo, :source, :tid_1)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 2:
- $tmid = db_query('insert into twithash_master (uid, query_date, geo, source, tid_1, tid_2) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 3:
- $tmid = db_query('insert into twithash_master (uid, query_date, geo, source, tid_1, tid_2, tid_3) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 4:
- $tmid = db_query('insert into twithash_master (uid, query_date, geo, source, tid_1, tid_2, tid_3, tid_4) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3, :tid_4)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2],
- ':tid_4' => $tIDs[3]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 5:
- $tmid = db_query('insert into twithash_master (uid, query_date, geo, source, tid_1, tid_2, tid_3, tid_4, tid_5) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3, :tid_4, :tid_5)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2],
- ':tid_4' => $tIDs[3],
- ':tid_5' => $tIDs[4]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- }
- if ($tweetId != NULL && $tmid != NULL) {
- $tweetIdQuery = db_insert('twithash_tid')
- ->fields(array(
- 'tweetId' => $tweetId,
- 'thmid' => $tmid))
- ->execute();
- }
- return $tmid;
- }
- /**
- *Provide simple form for visitor to submit tweets
- */
- function twit_submit_block_form() {
- $form = array();
- $form['twit_fieldset'] = array(
- '#type' => 'fieldset',
- '#title' => t('SUBMIT TWEET'),
- '#prefix' => '<div id="terms-fieldset-wrapper">',
- '#suffix' => '</div>',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#ajax' => array(
- 'callback' => 'twit_submit_block_submit_callback',
- )
- // '#attributes' => array('onkeypress' => 'if(event.keyCode==13){ this.form.submit;}'),
- );
- $form['twit_fieldset']['tweet'] = array(
- '#type' => 'textarea',
- '#title' => t('Tweet'),
- '#description' => t('Please enter Tweet URL'),
- '#maxlength' => 80,
- '#size' => 25,
- '#attributes' => array('onchange' => 'tweetCheck(this.form.tweet.value)',),
- );
- $form['twit_fieldset']['submit'] = array(
- '#type' => 'submit',
- '#value' => 'Submit',
- '#id' => 'twitSubmitBtn',
- '#ajax' => array(
- 'callback' => 'twit_submit_block_submit_callback',
- )
- );
- $form['twit-notification'] = array(
- '#prefix' => '<div id="twit-notification">',
- '#suffix' => '</div>',
- );
- $form['twit-check'] = array(
- '#prefix' => '<div id="twit-check">',
- '#suffix' => '</div>',
- );
- $form['#attached']['js'][] = array(
- 'type' => 'inline',
- 'data' => drupal_get_path('module', 'twit_submit') . '/twit_submit.js',
- 'type' => 'file',
- );
- return $form;
- }
- /**
- *Form submit handler
- */
- function twit_submit_form_submit($form, &$form_state) {
- twit_submit_block_submit_callback($form, $form_state);
- }
- function twit_submit_block_submit_callback($form, &$form_state) {
- $form_state['rebuild'] = TRUE;
- //define Tokens for REST API request
- $settings = array(
- 'oauth_access_token' => "181287687-FNQLOpVXocD3gP46souGOj4FY1kMPlDzNw795MwQ",
- 'oauth_access_token_secret' => "w9KuI6T44w2HX6P8OCcOUDePHdyT6l0iGRCljKuZF9AE9",
- 'consumer_key' => "GULWdbfgUBicLUxEAD5a6KeE6",
- 'consumer_secret' => "6ereWWc9nkTZCS0TtgCDfW4tcTO3E5Wy5LW1kXk8qSrxL2YBAD"
- );
- //Acquire tweet ID
- $tweetSubmit = $form_state['values']['tweet'];
- $tweetIdArr = explode('status/', $tweetSubmit);
- $tweetId = $tweetIdArr[1];
- if ($tweetId == null) {
- return null;
- }
- $url = 'https://api.twitter.com/1.1/statuses/show.json';
- $getfield = '?id='.$tweetId.'&tweet_mode=extended';
- $requestMethod = 'GET';
- $twitter = new TwitterAPIExchange($settings);
- $response = $twitter->setGetfield($getfield)
- ->buildOauth($url, $requestMethod)
- ->performRequest();
- //Decode request
- $tresponse_decoded = json_decode($response);
- dpm($tresponse_decoded);
- //Create datetime object for title, media file path and content date field
- $nowtime = new DateTime();
- $unixtime = $nowtime->getTimestamp();
- $today = date("m.d.y");
- //Get screen name for title, media file path and content screen name field
- $twit_user = $tresponse_decoded->user->screen_name;
- //Check access level of user submitting tweet
- global $user;
- $ip = $user->data['geoip_location']['ip_address'];//get user's IP
- $uid = $user->uid;
- //Handler to optionally disable publishing of tweets based on access level
- if (in_array('content administrator', $user->roles) || in_array('administrator', $user->roles)) {
- $articleStatus = 1;
- $articlePromote = 0;
- }else{
- $articleStatus = 1;
- $articlePromote = 0;
- }
- //Prepare node object
- $node = new stdClass();
- $node->type = 'tweet';
- $node->language = LANGUAGE_NONE;
- node_object_prepare($node);
- //Define node title
- $node->title = $twit_user . '_' . $nowtime->format('Y.m.d.Hi');
- //Set basic node data: language, status, promoted, uid, posted/created date and tweet ID
- $node->body[$node->language][0]['value'] = $tresponse_decoded->full_text;
- $node->body[$node->language][0]['format'] = 'filtered_html';
- $node->status = $articleStatus;
- $node->promote = $articlePromote;
- $node->workbench_access = array('twitcher_tweet' => 'twitcher_tweet');
- $node->uid = $uid;
- $node->date = date('Y-m-d');//***!This should be changed to previous date variable
- $node->created = time();
- $node->field_tweet_id[$node->language][0]['value'] = $tresponse_decoded->id;
- //Get hashtags, populate taxonomy and set content type to tid
- $hashArray = array();
- $i = 0;
- foreach($tresponse_decoded->entities->hashtags as $key => $h) {
- $hashArray[] = $h->text;
- $tid = twit_submit_block_taxonomy_check($h);
- $node->field_hashtag[$node->language][$i]['tid'] = $tid;
- $i++;
- }
- $twithashUpdate = twithash_block_update($hashArray, $unixtime, $uid, $ip, $tresponse_decoded->id);
- if (!empty($tresponse_decoded->entities->user_mentions)) {
- $userArray = array();
- foreach($tresponse_decoded->entities->user_mentions as $userName) {
- $userArray[] = $userName->screen_name;
- }
- $twitUserUpdate = twituser_block_update($userArray, $unixtime, $uid, $ip, $tresponse_decoded->id);
- }
- //Set content's link field to urls as displayed within the tweet
- $i = 0;
- if (!empty($tresponse_decoded->entities->urls)) {
- foreach ($tresponse_decoded->entities->urls as $url) {
- $node->field_tweet_links[$node->language][$i]['value'] = $tresponse_decoded->entities->urls[$i]->display_url;
- $i++;
- }
- }
- if (!empty($tresponse_decoded->user->profile_image_url_https)) {
- $node->field_profile_pic[$node->language][0]['value'] = $tresponse_decoded->user->profile_image_url_https;
- }
- //Check for attached media and create a directory for saving
- if (isset($tresponse_decoded->extended_entities->media)) {
- if (!is_dir(DRUPAL_ROOT . '/sites/default/files/Tweet_Media/' . $today)) {
- mkdir(DRUPAL_ROOT . '/sites/default/files/Tweet_Media/' . $today);
- }
- //Save each media entity with a unique filename within directory
- $i = 0;
- foreach($tresponse_decoded->extended_entities->media as $media) {
- $ext = substr($media->media_url, -3);
- $filename = 'public://Tweet_Media/' . $today . '/' . $twit_user . $unixtime . $i . '.' . $ext;
- file_put_contents($filename, file_get_contents($media->media_url));
- //Download file and save to Drupal filesystem
- $image = file_get_contents($media->media_url);
- $file = file_save_data($image, $filename,FILE_EXISTS_REPLACE);
- //Associate file with content image field
- $node->field_tweet_images[$node->language][$i] = array(
- 'fid' => $file->fid,
- 'filename' => $file->filename,
- 'filemime' => $file->filemime,
- 'uid' => 1,
- 'uri' => $file->uri,
- 'status' => 1
- );
- $i++;
- }
- if(!empty($tresponse_decoded->extended_entities->media[0]->video_info->variants)) {
- $z = null;
- $vidUrl = null;
- $bitrate = new stdClass();
- $bitrate->value = null;
- $bitrate->index = null;
- for ($z = 0; $z < $tresponse_decoded->extended_entities->media[0]->video_info->variants; $z++) {
- if (!empty($tresponse_decoded->extended_entities->media[0]->video_info->variants[$z]->bitrate) &&
- $tresponse_decoded->extended_entities->media[0]->video_info->variants[$z]->content_type === 'video/mp4') {
- if ($tresponse_decoded->extended_entities->media[0]->video_info->variants[$z]->bitrate > $bitrate->value) {
- $bitrate->value = $tresponse_decoded->extended_entities->media[0]->video_info->variants[$z]->bitrate;
- $bitrate->index = $z;
- }
- }
- }
- if ($bitrate->index !== null) {
- $vidUrl = $tresponse_decoded->extended_entities->media[0]->video_info->variants[$bitrate->index]->url;
- }
- $destination = 'public://Tweet_Media/' . $today;
- if ($vFile = system_retrieve_file($vidUrl, $destination, TRUE, FILE_EXISTS_REPLACE)) {
- $node->field_tweet_video[$node->language][0]['value'] = $vFile->uri;
- }
- }
- }
- //Set content screen name, date and tweet url
- $node->field_screen_name[$node->language][0]['value'] = $twit_user;
- $node->field_tweet_date[$node->language][0]['value'] = $unixtime;
- $node->field_tweet_date[$node->language][0]['timezone'] = 'America/New_York';
- $node->field_tweet_date[$node->language][0]['data_type'] = 'datestamp';
- $node->field_tweet_url[$node->language][0]['value'] = $tweetSubmit;
- //Set the node path and save
- $path = 'tweet/' . $tweetId;
- $node->path = array('alias' => $path);
- // if(node_save($node)) {
- // $commands[] = ajax_command_html('#twit-notification', 'Tweet submitted to Twitcher!');
- // }else{
- //
- // $commands[] = ajax_command_html('#twit-notification', 'Tweet could not be saved.');
- // }
- try {
- node_save($node);
- $commands[] = ajax_command_css('#twit-notification', array("display" => "block"));
- $commands[] = ajax_command_html('#twit-notification', 'Tweet submitted to Twitcher!');
- }catch(Exception $e) {
- dpm($e->getMessage());
- $commands[] = ajax_command_css('#twit-notification', array("display" => "block"));
- $commands[] = ajax_command_html('#twit-notification', 'Tweet could not be saved.');
- }
- $commands[] = ajax_command_invoke('#edit-tweet', 'val', array(''));
- // $commands[] = ajax_command_invoke('#twit-notification', 'addClass', array('twit-active'));
- $commands[] = ajax_command_invoke('#twit-notification', 'delay', array(3000));
- $commands[] = ajax_command_invoke('#twit-notification', 'fadeOut', array('slow'));
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- /*
- * Implements hook_block_info()
- */
- /**
- * @return mixed
- */
- function twit_submit_block_info() {
- $blocks['twit_submit'] = array(
- 'info' => t('Submit tweet as article/node!'),
- );
- return $blocks;
- }
- /*
- * Implements hook_block_view()
- */
- /**
- * @param $delta
- * @return array
- */
- function twit_submit_block_view($delta) {
- $block = array();
- $twit_form = drupal_get_form('twit_submit_block_form');
- switch ($delta) {
- case 'twit_submit':
- $block['subject'] = t('Widget to submit tweets and save as node');
- $block['content'] = drupal_render($twit_form);
- break;
- }
- return $block;
- }
- /**
- * @param $userArray
- * @param $unixtime
- * @param $uid
- * @param $ip
- * @param null $tweetId
- * @param null $location
- * @return DatabaseStatementInterface|int|null
- * @throws Exception
- */
- function twituser_block_update($userArray, $unixtime, $uid, $ip, $tweetId = NULL, $location = NULL) {
- $tumid = null;
- // watchdog('twituser', var_dump($userArray));
- if ($ip == '127.0.0.1' && $location == NULL) {
- $geo = 1;
- } else {
- $location = smart_ip_get_location($ip);
- $geo = 1;
- }//Handling of non-local IPs to be added later
- $count = count($userArray);
- //Populate twithash_term table with new terms or update number of hits for recurring terms. Simultaneously update twithash_term_update table which
- //tracks specific dates for each time a given term is searched.
- for ($i = 0; $i<$count; $i++) {
- $userName = $userArray[$i];
- $transaction = db_transaction();
- try{
- $tID = db_query('insert into twituser_name (name, hits, start) values (:name, 1, :start) on DUPLICATE KEY UPDATE hits = hits + :hits',
- array(
- ':name' => $userName,
- ':start' => $unixtime,
- ':hits' => 1
- ),
- array('return' => Database::RETURN_INSERT_ID));
- //Insert IDs are collected for use in the query_master table, which tracks which different terms were compared up to a maximum
- //of 5 terms (the maximum allowed by Google Trends)
- if ($tID != 0)
- db_insert('twituser_name_update')
- ->fields(array(
- 't_id' => $tID,
- 'hit_time' => $unixtime
- ))
- ->execute();
- $tIDs[] = $tID;
- }
- catch (Exception $e) {
- $transaction->rollback();
- throw $e;
- }
- }
- $numTerms = isset($tIDs) ? count($tIDs) : 0;//Get number of terms in query
- switch ($numTerms) {//add overall query to twithash_master
- case 0:
- break;
- case 1:
- $tumid = db_query('insert into twituser_master (uid, query_date, geo, source, tid_1) values (:uid, :query_date, :geo, :source, :tid_1)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 2:
- $tumid = db_query('insert into twituser_master (uid, query_date, geo, source, tid_1, tid_2) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 3:
- $tumid = db_query('insert into twituser_master (uid, query_date, geo, source, tid_1, tid_2, tid_3) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 4:
- $tumid = db_query('insert into twituser_master (uid, query_date, geo, source, tid_1, tid_2, tid_3, tid_4) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3, :tid_4)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2],
- ':tid_4' => $tIDs[3]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- case 5:
- $tumid = db_query('insert into twituser_master (uid, query_date, geo, source, tid_1, tid_2, tid_3, tid_4, tid_5) values (:uid, :query_date, :geo, :source, :tid_1, :tid_2, :tid_3, :tid_4, :tid_5)',
- array(
- ':uid' => $uid,
- ':query_date' => $unixtime,
- ':geo' => $geo,
- ':source' => 1,
- ':tid_1' => $tIDs[0],
- ':tid_2' => $tIDs[1],
- ':tid_3' => $tIDs[2],
- ':tid_4' => $tIDs[3],
- ':tid_5' => $tIDs[4]
- ),
- array('return' => Database::RETURN_INSERT_ID));
- break;
- }
- if ($tweetId != NULL && $tumid != NULL) {
- $tweetIdQuery = db_insert('twituser_tid')
- ->fields(array(
- 'tweetId' => $tweetId,
- 'tumid' => $tumid))
- ->execute();
- }
- return $tumid > 0 ? $tumid : -1;
- }
|