質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2071閲覧

【PHP】Twitter StreamingAPIによるしりとり機能で数回で処理が止まる

rera

総合スコア109

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2015/08/20 09:30

お世話になっております。

趣味でPHPをやっており、TwitterのUserstreamを用いてしりとりをやろうと思っているのですが
数回しりとりを行うと止まってしまいます(詳しくはリプライが返ってこなくなる)

PHP

1<?php 2error_reporting(E_ALL & ~E_NOTICE); 3 4$file = array_map('trim', file('word.txt')); 5$i = 0; 6 7// OAuthのいつもの 8$consumer_key = ''; 9$consumer_secret = ''; 10$oauth_token = ''; 11$oauth_token_secret = ''; 12 13$url = 'https://userstream.twitter.com/1.1/user.json'; 14$method = 'GET'; 15 16// パラメータ 17$oauth_parameters = array( 18 'oauth_consumer_key' => $consumer_key, 19 'oauth_nonce' => microtime(), 20 'oauth_signature_method' => 'HMAC-SHA1', 21 'oauth_timestamp' => time(), 22 'oauth_token' => $oauth_token, 23 'oauth_version' => '1.0', 24); 25 26// 署名を作る 27$a = $oauth_parameters; 28ksort($a); 29$base_string = implode('&', array( 30 rawurlencode($method), 31 rawurlencode($url), 32 rawurlencode(http_build_query($a, '', '&', PHP_QUERY_RFC3986)) 33)); 34$key = implode('&', array(rawurlencode($consumer_secret), rawurlencode($oauth_token_secret))); 35$oauth_parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_string, $key, true)); 36 37// 接続&データ取得 38$fp = fsockopen("ssl://userstream.twitter.com", 443); 39if ($fp) { 40 fwrite($fp, "GET " . $url . " HTTP/1.1\r\n" 41 . "Host: userstream.twitter.com\r\n" 42 . 'Authorization: OAuth ' . http_build_query($oauth_parameters, '', ',', PHP_QUERY_RFC3986) . "\r\n" 43 . "\r\n"); 44 while (!feof($fp)) { 45 $res = fgets($fp); 46 $res = json_decode($res, true); 47 /* 48 * しりとり開始 49 */ 50 if (strstr($res['text'], "@hoge しりとりしよ")) { 51 $name = $res['user']['name']; 52 $screen_name = $res['user']['screen_name']; 53 $protectScreen_name = $screen_name; 54 toTweet($name, $screen_name, "さんとしりとり開始!「しりとり」からはじまるよ!" . date("H時i分s秒")); 55 } 56 /* 57 * 以降しりとり 58 */ 59 if(preg_match("/@hoge /", $res['text'])){ 60 $first = trim(preg_replace("/@lu_iskun /", "", $res['text'])); 61 $firstChar = toGetFirstChar($first); //返ってきた単語の頭文字 62 $lastChar = toGetLastChar($first); //返ってきた単語の末尾 63 } 64 /* 末尾「ん」判定 */ 65 if ($lastChar === "ん" && $protectScreen_name === $res['user']['screen_name']) { 66 toTweet($name, $protectScreen_name, "はい!負け!" . date("H時i分s秒")); 67 } 68 /* しりとり */ 69 if ($firstChar === "り" || $firstChar === $c && $protectScreen_name === $res['user']['screen_name']) { 70 for ($i; $i < count($file); $i++) { 71 if (strpos($file[$i], $lastChar) === 0){ 72 toTweet($name, $screen_name, "「${first}」だね!じゃあ次は「${file[$i]}」!" . date("H時i分s秒")); 73 $c = toGetLastChar($file[$i]); 74 unset($file[$i]); 75 break; 76 } 77 } 78 } 79 } 80 } 81 82fclose($fp); 83 84function toTweet($name, $screen_name, $word) 85{ 86 require_once 'twitteroauth.php'; 87 88 $name = $name; 89 $word = $word; 90 $sConsumerKey = ""; 91 $sConsumerSecret = ""; 92 $sAccessToken = ""; 93 $sAccessTokenSecret = ""; 94 $twObj = new TwitterOAuth($sConsumerKey, $sConsumerSecret, $sAccessToken, $sAccessTokenSecret); 95 $sTweet = "@$screen_name " . $word; 96 $vRequest = $twObj->OAuthRequest("https://api.twitter.com/1.1/statuses/update.json", "POST", array("status" => $sTweet)); 97} 98function toGetFirstChar($string) 99{ 100 $encode = urlencode($string); 101 $encode = substr($encode, 0, 9); 102 $decode = urldecode($encode); 103 104 return $decode; 105} 106function toGetLastChar($string) 107{ 108 $encode = urlencode($string); 109 $encode = substr($encode, -9); 110 $decode = urldecode($encode); 111 112 return $decode; 113}

Botが返信する単語リストを.txtに改行してまとめています。

読みにくいコード & 読み解いてもらうには長いと思うのですが処理にあたって止まってしまう点について何か気になることがあれば教えていただきたいのです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TwitterのAPIには時間当たりのアクセス回数制限があるのでその回数に引っかかっているのではないでしょうか。
「数回」というのが下記のリストの回数と一致するようで、その可能性があると思います。
https://dev.twitter.com/rest/public/rate-limits

投稿2015/08/21 11:29

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問