1

https://github.com/jmathai/twitter-asyncから twitter-async を使用してツイートを削除するためのヘルプを探しています。ツイートを検索していると思いますか?

次のコードを試すと、Twitter に投稿できます

try {
    $twitter->post_statusesUpdate(array('status' => $tweet));
} catch (EpiTwitterForbiddenException $e) {
    $msg = json_decode($e->getMessage());
    if ($msg->error != 'Status is a duplicate.') {
    //throw $e;
    }
}

https://dev.twitter.com/docs/api/1.1/post/statuses/destroy/%3Aid

ただし、2 回目に実行された場合は、重複ツイートであると返されます... または、数ツイート前にツイートされた場合は、重複ツイートであると再度​​返されます。

重複したツイートを検索して削除するか、直接削除してから、正確なメッセージをもう一度ツイートする (トップ/最新のツイートに入れる) にはどうすればよいですか?

何か案は?

4

1 に答える 1

4

やりたいことをするには、次のことを行う必要があります。

  • 1 つ目: ユーザーのツイートを検索し、その json を解釈して、繰り返しツイートがあればその ID を取得します。(テキストを比較するときは、php 関数 htmlspecialchars() を使用する必要があることに注意してください。これは、Twitter に HTML エンティティとして格納されている特殊文字があるためです[ref.] );

  • 2番目: 繰り返しツイートが存在する場合は削除します。

  • 3: ツイートを (再) 投稿します。

(オプションで、ツイートの通常の送信を試行する 0 番目のステップを追加し、エラーがある場合にのみ他のステップに進むことができます。それはあなた次第です。)

ここに、これらのリクエストを作成し、検索の json を解釈するコードなどがあります。

$settings = array(
    'oauth_access_token' => "...",
    'oauth_access_token_secret' => "...",
    'consumer_key' => "...",
    'consumer_secret' => "..."
);

$API = new twitter_API($settings);

$tweet_text = '>>testing the twitter API-1.1...';


## search the list of tweets for a duplicate...
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$json = $API->make_request($url, "GET");

$twitter_data = json_decode($json);

$id_str = null;
foreach ($twitter_data as $item){
    $cur_text = $item->text;

    if (strcmp($cur_text, htmlspecialchars($tweet_text))==0){
        $id_str = $item->id_str;
        echo "found a duplicate tweet with the id: " . $id_str . "<br /><br />";
    }
}


## remove the duplicate, if there is one...
if ($id_str){
    $url = "https://api.twitter.com/1.1/statuses/destroy/" . $id_str . ".json";
    $json = $API->make_request($url, "POST");
    echo $json . '<br /><br />';
}


## post the tweet
$url = "https://api.twitter.com/1.1/statuses/update.json";
$postfields = array(
    'status' => $tweet_text
);
$json = $API->make_request($url, "POST", $postfields);
echo $json . '<br /><br />';

このコードは、クラス twitter_API を使用します。これは、[ref.]の回答から適応したものです。このクラスを使用するか、関数の呼び出しを twitter-async の関数に置き換えることができます。

class twitter_API
{
    private $oauth_access_token;
    private $oauth_access_token_secret;
    private $consumer_key;
    private $consumer_secret;
    protected $oauth;

    public function __construct(array $settings){
        if (!in_array('curl', get_loaded_extensions())){
            echo 'you need to install cURL!';
            exit();
        }
        $this->oauth_access_token = $settings['oauth_access_token'];
        $this->oauth_access_token_secret = $settings['oauth_access_token_secret'];
        $this->consumer_key = $settings['consumer_key'];
        $this->consumer_secret = $settings['consumer_secret'];
    }

    function build_base_string($base_URI, $method, $params){
        $r = array();
        ksort($params);
        foreach($params as $key=>$value){
            $r[] = "$key=" . rawurlencode($value);
        }
        return $method . "&" . rawurlencode($base_URI) . '&' . rawurlencode(implode('&', $r));
    }

    function build_authorization_header($oauth){
        $r = 'authorization: oauth ';
        $values = array();
        foreach ($oauth as $key=>$value)
            $values[] = "$key=\"" . rawurlencode($value) . "\"";
        $r .= implode(', ', $values);
        return $r;
    }

    function make_request($url, $type, $args=null){
        $this->oauth = array( 'oauth_consumer_key' => $this->consumer_key,
                        'oauth_nonce' => time(),
                        'oauth_signature_method' => 'HMAC-SHA1',
                        'oauth_token' => $this->oauth_access_token,
                        'oauth_timestamp' => time(),
                        'oauth_version' => '1.0');

        if (($type=="GET") && (!is_null($args))){
            $getfields = str_replace('?', '', explode('&', $args));
            foreach ($getfields as $field){
                $field_strs = explode('=', $field);
                $this->oauth[$field_strs[0]] = $field_strs[1];
            }
        }

        $base_info = $this->build_base_string($url, $type, $this->oauth);
        $composite_key = rawurlencode($this->consumer_secret) . '&' . rawurlencode($this->oauth_access_token_secret);
        $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
        $this->oauth['oauth_signature'] = $oauth_signature;

        // make request
        $header = array($this->build_authorization_header($this->oauth), 'expect:');
        $options = array( CURLOPT_HTTPHEADER => $header,
                          CURLOPT_HEADER => false,
                          CURLOPT_URL => $url,
                          CURLOPT_RETURNTRANSFER => true,
                          CURLOPT_SSL_VERIFYPEER => false);
        if ($type=="POST"){
            if (is_null($args)){
                $args = array();
            }
            $options[CURLOPT_POSTFIELDS] = $args;
        }
        else if (($type=="GET") && (!is_null($args))){
            $options[CURLOPT_URL] .= $args;
        }

        $feed = curl_init();
        curl_setopt_array($feed, $options);
        $json = curl_exec($feed);
        curl_close($feed);

        return $json;
    }
}
于 2013-09-17T16:26:25.520 に答える