'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' => '
', '#suffix' => '
', '#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' => '
', '#suffix' => '
', ); $form['twit-check'] = array( '#prefix' => '
', '#suffix' => '
', ); $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; }