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

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

ただいまの
回答率

88.62%

PythonTwitterでの構文エラー

受付中

回答 1

投稿 編集

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

mer

score 12

PythonでTwitterの自身のホームTLを取得しその中から指定ワードでいいねするコードを作成していますが、構文エラーがでます。

エラーコード

Traceback (most recent call last):
  File "/data/data/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in <module>                          start(fakepyfile,mainpyfile)                              File "/data/data/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start                             exec(open(mainpyfile).read(),  main.dict)         File "<string>", line 23                                      for result in search_results:                                 ^                                                     SyntaxError: invalid syntax                                 [Program finished]

質問内容はPythonでTwitter自身のホームTLを取得しその中から指定ワードでいいねする方法です。
そもそもこちらのコード自体が正しく動作するかどうかも疑問でエラー以前の問題だと私は思っていたのですが、回答者様によりますとあくまでもエラーだけが原因らしいので、解決法を提示していただけたらと思います。

他にPythonの正しいTwitterの使い方をご存知の方は正しいコードの回答をいただければ幸いです。

from requests_oauthlib import OAuth1Session

CK = ''
CS = ''
AT = ''
AS = ''

# OAuth1Sessionによる認証
twitter = OAuth1Session(CK, CS, AT, AS)

# パラメータ
params = {
    'count': 5, # 取得するタイムライン数
}

response = twitter.get('https://api.twitter.com/1.1/statuses/home_timeline.json', params=params)

search_results = api.search(q="指定するキーワード", count=10)

try:api.create_favorite(tweet_id)

for result in search_results:
    tweet_id = result.id #Tweetのidを取得
    user_id = result.user._json['id']
    tweet in response.json():
    print('-'*30)
    print(tweet['user']['name'], '@'+ tweet['user']['screen_name']) # ユーザー名
    print(tweet['created_at']) # 投稿日時
    print(tweet['text'])# 本文
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • quickquip

    2019/07/03 09:54 編集

    質問のタイトルが「構文エラー」なので回答者側は当然

    質問者は構文エラーが起きて困っている状況だからそれを直したい

    という意図の質問だと思うわけです。
    だから「エラーを見せろ」「エラーが出るコードを見せろ」って書くし、いっこうにそれらが出てこなければ「なんで隠すんだ」って思うわけ。至極当然ですね。

    ところが実はこの質問の意図は「構文エラーが起きることを直したい」のではなくて

    自分がやりたいコードをどう書くのか自分で調べるのが面倒だから誰か教えてください

    なわけです。
    質問のタイトルと、情報の提示の仕方と、質問の意図がバラバラなので回答者側が混乱しているんです。

    キャンセル

  • quickquip

    2019/07/03 10:02

    > こちらのコード自体が正しく動作するかどうかも疑問でエラー以前の問題だと私は思っていたのですが
    これでタイトルを「構文エラー」にしたのが間違いでしょう。

    > 回答者様によりますとあくまでもエラーだけが原因らしいので
    はちょっと意味が取れないですね。

    キャンセル

  • tetsunosuke

    2019/07/03 10:27

    初心者ということで多少大目にはみてあげようよと思いながら...

    > やはりこれエラーどうこう以前に"いいねする"というコード自体が間違っているだけだと思うのですが…。

    そうですね。
    回答されている方が

    > でも、そもそもapiを定義してないのか。だとしたら動かないなこれ。

    のように書いているので、そもそも一番最初に、

    > 上のコードの方はtweepyでしょうか?
    > 下のコードが今書きかけのコードで、こちらはtweepyを使わずにrequests-oauthlibを使って自前でアクセスしているということで合ってますか?

    というところもちゃんと取り入れてほしいと思います。
    個人的な考えでは、tweepyで作り直すのが良いと思います。

    こちらの記事はすでにご覧になっている気もしますが、
    https://qiita.com/gurensouen/items/484e3198bcafa69f5c8b
    かなり参考になると思います。

    キャンセル

回答 1

0

とりあえず、try文には、最低でも続けてexcept節が必要になります。

try:
    例外が起きるかもしれない処理
except:
    例外が起きたときの処理

except節がないことか直接の構文エラーの原因になります。実際にはもっといろいろな機能があるので、このあたりの構文についてご存知でなければ、よく調べてみてください。
(単一の文or式であればコロンの後ろに続けること自体は問題ではありません。あまりおすすめはしませんが。)

質問文のコードの意図までちゃんと汲み取れているわけではありませんが、直すとしたらこんな感じでしょうか。

from requests_oauthlib import OAuth1Session

CK = ''
CS = ''
AT = ''
AS = ''

# OAuth1Sessionによる認証
twitter = OAuth1Session(CK, CS, AT, AS)

# パラメータ
params = {
    'count': 5, # 取得するタイムライン数
}

response = twitter.get('https://api.twitter.com/1.1/statuses/home_timeline.json', params=params)

search_results = api.search(q="指定するキーワード", count=10)

for result in search_results:
    tweet_id = result.id #Tweetのidを取得
    user_id = result.user._json['id']
    tweet in response.json():
    print('-'*30)
    print(tweet['user']['name'], '@'+ tweet['user']['screen_name']) # ユーザー名
    print(tweet['created_at']) # 投稿日時
    print(tweet['text'])# 本文

    # tweet_idを参照するってことは、少なくともループの中に入れる必要はあるんだろうなと・・・
    try:
        api.create_favorite(tweet_id)
    except:
        pass

でも、そもそもapiを定義してないのか。だとしたら動かないなこれ。
(全体の構文解析が行われてから実行が始まるので、SyntaxErrorは直るけど違うエラーが出る、という状態になることでしょう。)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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