5

Twitterアカウントに自動投稿するTwitterアプリケーションを作成しました。したがって、新しいユーザーを承認する必要はありません。

アクセスレベルを読み取り/書き込みに設定し、アクセストークンを受け取りました。アプリケーションでOAuthツールを使用してcURLコマンドを生成しました。

curl --request'POST''https ://api.twitter.com/1/statuses/update.json ' --data'status = Maybe + he%27ll + finally + find + his + keys。+%23peterfalk' --header'認証:OAuth oauth_consumer_key = "..."、oauth_nonce = "97fad626790e8e5988d4a06cfd47fa74"、oauth_signature = "..."、oauth_signature_method = "HMAC-SHA1"、oauth_timestamp = "1364161424"、oauth_token = "..." 、oauth_version = "1.0"'--verbose

コマンドの上に、次のように表示されます。

重要:これは数分間のみ有効です。また、cURLコマンドが実際にリクエストを実行することを忘れないでください。

これはLinuxターミナルで動作すると思います。

これをPHPcURLコマンドに変換する方法を知りたいのですが。これが私が試したことです。$ DSTの値は、https: //dev.twitter.com/docs/auth/authorizing-requestの「DST」の値であることに注意してください。--header 'Authorization:また、OAuthツールのcURLコマンドの後の文字列の値と同じです。

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => array(
        data => 'status='.urlencode($status),
        header => 'Authorization: '.$DST
    )
));
$resp = curl_exec($ch);
curl_close($ch);

しかし、の値$respは次のとおりです。

{
request: "/1/statuses/update.json",
error: "Could not authenticate you."
}

私が間違っていることはありますか?OAuthツールは、cURLコマンドが実際に機能すると言っていることに注意してください。したがって、PHPでcURLを配置する方法を理解するだけの問題だと思います。私はそれをあまりよく知らない。また、可能であればOAuthライブラリの使用を避けたいことにも注意してください。ライブラリ全体をインストールするよりも、これにははるかに軽量なソリューションがあるはずだと思います。

4

2 に答える 2

2

私は3つの問題を抱えていました:

(1)この質問には含めませんでしたが、署名が正しく作成されませんでした。

私がやっていたのはbase64_encode(hash_hmac('sha1', $base, $key));、hash_hmacの4番目のパラメーターを設定して、16true進数ではなく生のバイナリを返すようにする必要がありました(16進数はTwitterドキュメントの例として示されているため、混乱していました)。したがって、正しい関数は次のとおりbase64_encode(hash_hmac('sha1', $base, $key, true));です。

(2)cURLが正しく設定されていません。承認を設定するにはCURLOPT_HTTPHEADERが必要であり、CURL_VERBOSEをtrueに設定する必要があります。

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $DST));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.rawurlencode($status));
curl_setopt($ch, CURLOPT_URL, $url);

(3)上記のコードに見られるように、配列ではなく文字列としてステータスを投稿する必要がありました。この質問でこの問題の解決策を見つけました:なぜOAuthで認証できないのですか?

これらすべてが完全に機能しています。また、Twitterアプリケーションのアクセストークンに、アクセスレベルが「読み取りと書き込み」であることが示されていることを確認してください。そうでない場合は、[設定]で権限を変更してから、[詳細]に戻ってアクセストークンを再作成します。

フルスクリプト

<?php

class Tweet {

public $url = 'https://api.twitter.com/1/statuses/update.json';

function the_nonce(){
    $nonce = base64_encode(uniqid());
    $nonce = preg_replace('~[\W]~','',$nonce);
    return $nonce;
}

function get_DST($status){

    $url = $this->url;

    $consumer_key = $your_consumer_key_here;
    $nonce = $this->the_nonce();
    $sig_method = 'HMAC-SHA1';
    $timestamp = time();
    $version = "1.0";
    $token = $your_token_here;
    $access_secret = $your_access_secret_here;
    $consumer_secret = $your_consumer_secret_here;

    $param_string = 'oauth_consumer_key='.$consumer_key.
            '&oauth_nonce='.$nonce.
            '&oauth_signature_method='.$sig_method.
            '&oauth_timestamp='.$timestamp.
            '&oauth_token='.$token.
            '&oauth_version='.$version.
            '&status='.rawurlencode($status);
    $sig_base_string = 'POST&'.rawurlencode($url).'&'.rawurlencode($param_string);
    $sig_key = rawurlencode($consumer_secret).'&'.rawurlencode($access_secret);

    $tweet_sig = base64_encode(hash_hmac('sha1', $sig_base_string, $sig_key, true));

    $DST = 'OAuth oauth_consumer_key="'.rawurlencode($consumer_key).'",'.
        'oauth_nonce="'.rawurlencode($nonce).'",'.
        'oauth_signature="'.rawurlencode($tweet_sig).'",'.
        'oauth_signature_method="HMAC-SHA1",'.
        'oauth_timestamp="'.rawurlencode($timestamp).'",'.
        'oauth_token="'.rawurlencode($token).'",'.
        'oauth_version="1.0"';
    return $DST;
}

function set($status){

    $url = $this->url;

    $ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $this->get_DST($status)));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.rawurlencode($status));
curl_setopt($ch, CURLOPT_URL, $url);

    $result = json_decode(curl_exec($ch));
if(!curl_errno($ch)){
    $info = curl_getinfo($ch);
    if($info['http_code']!='200'){
//error posting
echo 'Error: '.$result->{'error'};
    }else{
//success
echo 'Success! <a href="https://twitter.com/AOKHalifax/status/'.$result->{'id_str'}.'" target="_blank">View Tweet</a>';
    }
}else{
    //error connecting
    echo 'error posting';
    }
    curl_close($ch);
    }
}

/* 
Usage example:
$status = new Tweet();
$status->set('checking'); 
*/

?>
于 2013-03-25T04:00:12.550 に答える
2

こんにちは、あなたの助けに感謝します。

私は同じ問題を抱えていました、あなたは私のコードの下にあります:

<?php
public function updateStatus($message)
{
    // Encoding message for the curl data parameter
    $messageData = rawurlencode($message);

    // Double encoding message for the message in signature base string
    $messageSignature = rawurlencode($messageData);

    // URL for posting a new tweet
    $statusURL = rawurlencode('https://api.twitter.com/'.$this->version.'/statuses/update.json');

    // Create oauth_nonce parameter
    $oauth_nonce = preg_replace('~[\W]~','',base64_encode(uniqid()));

    // Create timestamp
    $oauth_timestamp = time();

    // Create signature base string parameter
    $signature_base_string = "POST&".$statusURL."&oauth_consumer_key%3D".CB_TWITTER_API_KEY."%26oauth_nonce%3D".$oauth_nonce."%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D".$oauth_timestamp."%26oauth_token%3D".$this->sessionData['oauth_token']."%26oauth_version%3D1.0%26status%3D".$messageSignature."";

    // Create signature key 
    $signature_key = CB_TWITTER_SECRET_KEY.'&'.$this->sessionData['oauth_token_secret'];

    // Create new signature
    $newSignature = rawurlencode(base64_encode(hash_hmac('sha1', $signature_base_string, $signature_key, true)));

    // Create header
    $header="Authorization: 
                OAuth 
                oauth_consumer_key=\"".CB_TWITTER_API_KEY."\", 
                oauth_nonce=\"".$oauth_nonce."\", 
                oauth_signature=\"".$newSignature."\", 
                oauth_signature_method=\"HMAC-SHA1\", 
                oauth_timestamp=\"".$oauth_timestamp."\", 
                oauth_token=\"".$this->sessionData['oauth_token']."\", 
                oauth_version=\"1.0\"";

    // Replace line breaks and tabulations in header
    $header = preg_replace( "/\r|\n|\t/", "", $header);

    // Init cURL
    $ch = curl_init();

    // Put header
    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));

    // Set request type to POST for POSTing a tweet
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

    // Enable verbose for debugging only
    curl_setopt($ch, CURLOPT_VERBOSE, false);

    // Return the transfer in a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // Set URL of cURL request
    curl_setopt($ch, CURLOPT_URL, rawurldecode($statusURL));

    // Do a POST request (HTML POST)
    curl_setopt($ch, CURLOPT_POST, 1);

    // Set data
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.$messageData);

    // Execute cURL and store result
    $output = curl_exec($ch);

    // Close cURL
    curl_close($ch);

    if ($output) {
        $output = json_decode($output);
    }

    if ($this->hasErrors($output, false))
    {
        return false;
    }


   return true;
}
?>

お役に立てば幸いです。

于 2014-01-30T22:58:50.930 に答える