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

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

ただいまの
回答率

87.34%

curlでリクエストを送っても期待した結果が返ってこない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 914

score 1

はじめに

現在、TwitterのDMから画像を取得するBOTを開発しています。
Pythonでコーディングをしているのですがどうにもうまくいかず、一度試しに公式リファレンスにもあるようにCURLでのリクエストを行おうと考えました。
公式リファレンス,メディアの取得

本来であれば短縮URLが返ってくるようなのですが何も返ってこないため途方に暮れています。

※過去の質問に追記しようかと考えましたが質問の内容が異なっていると判断したため別枠を取らせていただきました。

実現したいこと

リクエストを行い新しく生成されたエンドポイントを入手したい。
あるいはこの状態がどういった状態なのか知りたい。
そもそも応答を得られていないのか、得られているが情報がないのか...。

コード

curl --request GET https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg -H "authorization: OAuth oauth_consumer_key=\"*******\", oauth_nonce=\"TekitouNaMojiretsu\", oauth_signature=\"Izcvm5YX4iSiZoBlxJl/V0iJH80%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1610263721\", oauth_token=\"*******\", oauth_version=\"1.0\""


※"の前に\が入っているのは使用しているPCがWindowsのため。\を外してMacでも試したが同様の結果であった。
※oauth_consumer_keyとoauth_tokenは念のため意図的に隠してあります。ご了承ください。

oauth_signatureを生成するためのコード

参考までにpythonでoauth_signature生成するまでのコード。importの記述漏れがあるかもしれませんがoauth_signatureは問題なく生成できていると思います。

import urllib
import hashlib
import hmac
import base64
consumer_key='******'
access_token='******'
nonce = "TekitouNaMojiretsu"
timestr = str(int(time()))
oauth_params = {
    'oauth_consumer_key': consumer_key,
    'oauth_nonce': nonce,
    'oauth_signature': None,
    'oauth_signature_method': 'HMAC-SHA1',
    'oauth_timestamp': timestr,
    'oauth_version': '1.0'
}
q_params = {}
[q_params.update({k: v}) for k, v in oauth_params.items()
 if k.startswith('oauth') if v is not None]
sig_key = consumer_key + "&" + access_token
#urlエンコードを外部サイトで行った(後日変更予定)
para = "oauth_nonce%3DTekitouNaMojiretsu%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D" + timestr + "%26oauth_version%3D1.0"
url2 = "https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg"
sig_data = "GET&" + url2 + "&" + para
sig = hmac.new(bytes(sig_key, 'utf-8'),bytes(sig_data, 'utf-8'),hashlib.sha1)
signature = base64.b64encode(sig.digest()).decode('utf-8')
oauth_params['oauth_signature'] = quote(signature)

--verboseを用いてリクエストを送った際の返答

curl --verbose https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg -H 'authorization: OAuth oauth_consumer_key="********", oauth_nonce="TekitouNaMojiretsu", oauth_signature="Izcvm5YX4iSiZoBlxJl/V0iJH80%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1610263721", oauth_token="*******", oauth_version="1.0"'
*   Trying 104.244.42.84...
* TCP_NODELAY set
* Connected to ton.twitter.com (104.244.42.84) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=US; ST=California; L=San Francisco; O=Twitter, Inc.; OU=tyo3; CN=ton.twitter.com
*  start date: May 19 00:00:00 2020 GMT
*  expire date: May 17 12:00:00 2021 GMT
*  subjectAltName: host "ton.twitter.com" matched cert's "ton.twitter.com"
*  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 High Assurance Server CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7ff656003c00)
> GET /1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg HTTP/2
> Host: ton.twitter.com
> User-Agent: curl/7.54.0
> Accept: */*
> authorization: OAuth oauth_consumer_key="1Cg869czeSApuPXjryx87LQSg", oauth_nonce="TekitouNaMojiretsu", oauth_signature="Izcvm5YX4iSiZoBlxJl/V0iJH80%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1610263721", oauth_token="1341974077708271616-cyH9YrFDVzQjnQy0nTFrUU3zHNTv1H", oauth_version="1.0"
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 302 
< cache-control: no-cache
< content-length: 0
< date: Mon, 11 Jan 2021 05:22:24 GMT
< location: https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg
< server: tsa_m
< set-cookie: personalization_id="********"; Max-Age=63072000; Expires=Wed, 11 Jan 2023 05:22:24 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
< set-cookie: guest_id=********; Max-Age=63072000; Expires=Wed, 11 Jan 2023 05:22:24 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
< strict-transport-security: max-age=631138519
< x-connection-hash: 59ab3ccde78507075e6dca4c0af51b7c
< x-content-type-options: nosniff
< x-response-time: 109
< 
* Connection #0 to host ton.twitter.com left intact
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • saba_111

    2021/01/11 15:59

    返信ありがとうございます。-Lを付けたところ「curl: (47) Maximum (50) redirects followed」というエラーが発生しました。調べたところエラー内容としては「リダイレクトが上限値を超えた」という事で、Cookieを設定すれば回避できるという事らしいのですが合ってますでしょうか。

    キャンセル

  • otn

    2021/01/11 16:02

    そうですね。送られたCookieを送り返すような指定にしないといけないと思われます。
    オプションを調べて指定してください。

    キャンセル

  • saba_111

    2021/01/11 16:05

    ご丁寧にありがとうございます。頑張って実装してみたいと思います。

    キャンセル

回答 1

check解決した方法

0

curlそのものは解決していませんがDMから画像を取得することはできたので解決ということにさせてもらいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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