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

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

ただいまの
回答率

90.60%

  • PHP

    19864questions

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

  • Twitter

    642questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 811

rera

score 86

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

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

<?php
error_reporting(E_ALL & ~E_NOTICE);

$file = array_map('trim', file('word.txt'));
$i = 0;

// OAuthのいつもの
$consumer_key = '';
$consumer_secret = '';
$oauth_token = '';
$oauth_token_secret = '';

$url = 'https://userstream.twitter.com/1.1/user.json';
$method = 'GET';

// パラメータ
$oauth_parameters = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_nonce' => microtime(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp' => time(),
    'oauth_token' => $oauth_token,
    'oauth_version' => '1.0',
);

// 署名を作る
$a = $oauth_parameters;
ksort($a);
$base_string = implode('&', array(
    rawurlencode($method),
    rawurlencode($url),
    rawurlencode(http_build_query($a, '', '&', PHP_QUERY_RFC3986))
));
$key = implode('&', array(rawurlencode($consumer_secret), rawurlencode($oauth_token_secret)));
$oauth_parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_string, $key, true));

// 接続&データ取得
$fp = fsockopen("ssl://userstream.twitter.com", 443);
if ($fp) {
    fwrite($fp, "GET " . $url . " HTTP/1.1\r\n"
        . "Host: userstream.twitter.com\r\n"
        . 'Authorization: OAuth ' . http_build_query($oauth_parameters, '', ',', PHP_QUERY_RFC3986) . "\r\n"
        . "\r\n");
    while (!feof($fp)) {
        $res = fgets($fp);
        $res = json_decode($res, true);
        /*
         * しりとり開始
         */
        if (strstr($res['text'], "@hoge しりとりしよ")) {
            $name = $res['user']['name'];
            $screen_name = $res['user']['screen_name'];
            $protectScreen_name = $screen_name;
            toTweet($name, $screen_name, "さんとしりとり開始!「しりとり」からはじまるよ!" . date("H時i分s秒"));
        }
        /*
         * 以降しりとり
         */
        if(preg_match("/@hoge /", $res['text'])){
            $first = trim(preg_replace("/@lu_iskun /", "", $res['text']));
            $firstChar = toGetFirstChar($first); //返ってきた単語の頭文字
            $lastChar = toGetLastChar($first); //返ってきた単語の末尾
        }
        /* 末尾「ん」判定 */
        if ($lastChar === "ん" && $protectScreen_name === $res['user']['screen_name']) {
            toTweet($name, $protectScreen_name, "はい!負け!" . date("H時i分s秒"));
        }
        /* しりとり */
        if ($firstChar === "り" || $firstChar === $c && $protectScreen_name === $res['user']['screen_name']) {
            for ($i; $i < count($file); $i++) {
                if (strpos($file[$i], $lastChar) === 0){
                    toTweet($name, $screen_name, "「${first}」だね!じゃあ次は「${file[$i]}」!" . date("H時i分s秒"));
                    $c = toGetLastChar($file[$i]);
                    unset($file[$i]);
                    break;
                }
            }
        }
    }
 }

fclose($fp);

function toTweet($name, $screen_name, $word)
{
    require_once 'twitteroauth.php';

    $name = $name;
    $word = $word;
    $sConsumerKey = "";
    $sConsumerSecret = "";
    $sAccessToken = "";
    $sAccessTokenSecret = "";
    $twObj = new TwitterOAuth($sConsumerKey, $sConsumerSecret, $sAccessToken, $sAccessTokenSecret);
    $sTweet = "@$screen_name " . $word;
    $vRequest = $twObj->OAuthRequest("https://api.twitter.com/1.1/statuses/update.json", "POST", array("status" => $sTweet));
}
function toGetFirstChar($string)
{
    $encode = urlencode($string);
    $encode = substr($encode, 0, 9);
    $decode = urldecode($encode);

    return $decode;
}
function toGetLastChar($string)
{
    $encode = urlencode($string);
    $encode = substr($encode, -9);
    $decode = urldecode($encode);

    return $decode;
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PHPのGETの引数を複数取得する方法。

    PHPアプリケーションで、同じ名前を持つ複数の引数があるリクエストURLを扱っています。 与えられたキーの全ての値を取得したいのですが、簡単に出来る方法はありますか?

  • 解決済

    TwitterAPIの制限について

    Twitter API 1.1について質問です。 TwitterAPIが1.0から1.1へ変わったことにより、制限が厳しくなったという話をよくみかけて調べてみました。 参考にして

  • 解決済

    TwitterOAuth.php で app auth の場合 "must be authentic...

    こちらのライブラリー利用しています。※4/3時点で最新のもの https://github.com/abraham/twitteroauth Consumer key,Consu

  • 解決済

    最新のTwitterAPIに対応できるコードを知りたい!!

    はじめまして! 現在、githubで公開されているOAuthライブラリ「twitteroauth」を使用して、Twitterのつぶやき情報を集めようとしている者です。 http

  • 解決済

    Phalcon ORMのキャッシュ削除

    下記URLのように、SELECT時にキャッシュを実装しました。 http://phalcon.io/cheat-sheet/ このキャッシュを、削除するにはどのようにすればよいで

  • 解決済

    多次元配列をセッションに保存したい

    ファイルから情報を読み込み、それをセッションに保存し、他のweb上のページでも表示できるようにしたいです。 ある学年の1組の生徒の情報がファイルに保存されています。 $cntが生

  • 受付中

    正規表現について

    度々正規表現のご質問をさせて頂きたいと思います。。 #3#3#1#3#-#3#-40#3#-40#3#+20#2#-1 このような文字列があります。 ここから#の後に-か+の

  • 解決済

    qrcodeをgif, jpgなどの画像としてフォルダに保存

    javascriptやPHPで画面にqrcodeを作成し表示できます。 qrcodeをgif,jpgなど画像としてサーバー、ローカルでどちらでもいいので保存したいです。 良い方

同じタグがついた質問を見る

  • PHP

    19864questions

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

  • Twitter

    642questions

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