リプライされた単語でwikipediaの概要をリプライし返すbotを作ってみた


はじめに

使用言語 python3
使用API twitterAPI,MediaWiki API
OS windows10
筆者はpython初心者

プログラムの大体の動き

twitterAPIにアクセス→リプライされたときにif文でwikiが入ってるか確認→data=wikiapi.getinfo(text)でWikiapi.pyのgetinfoに行く→mediawikiapiにアクセス→jsonを使って概要を取得→ツイート
まとめると、リプライにwikiという単語が入っていたら、その後ろの単語をmediawikiapiで検索してリプライし返すbot

ソースコード

#tweet.py

import tweepy
import Wikiapi
import datetime

CK="" #Consumer Key
CS="" #Consumer Secret
AT="" #Access Token
AS="" #Access Token Secret

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        status.created_at += datetime.timedelta(hours=9)

        if (status.in_reply_to_screen_name) == api.me().screen_name:

            status_id = status.id
            text = status.text.replace("@" + str(api.me().screen_name), "")
            text = text.replace(" ", "")
            if "wiki" in text:#リプライにwikiが入ってるか確認
                text=text.replace("wiki","")
                wikiapi=Wikiapi.Wikiapi()
                data=wikiapi.getinfo(text)#Wikiapi.pyのgetinfo呼び出し
                tweet_rep = "@" + str(status.user.screen_name) + " " + str(data.tweet)+"\n"+str(data.url)
                api.update_status(status=tweet_rep,in_reply_to_status_id=status_id)

        return True

    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True

    def on_timeout(self):
        print('Timeout...')
        return True

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()
#Wikiapi.py

import requests
import json
import urllib
class Wikiapi:
    def getinfo(self,word):
        word=urllib.parse.quote(word)
        api="https://ja.wikipedia.org/w/api.php?action=query&format=json&titles={word}&prop=extracts&redirects=1&exchars=100&explaintext=1"
        api=api.format(word=word)
        r=requests.get(api)#APIにアクセス
        data=json.loads(r.text)
        pages=data["query"]["pages"]
        for page in pages:
            try:
                self.tweet=data["query"]["pages"][page]["extract"]#wikiの説明文を参照
                self.url="https://ja.wikipedia.org/wiki/"+word#urlもツイートに追加
                return self
            except KeyError:#記事なかった場合
                self.tweet="記事がありませんでした"
                return self

解説

読みづらいのは許してください
ちょいちょいコメントで解説していますが要点を紹介
if "wiki" in text:リプライにwikiが入ってるか確認
self.tweet=data["query"]["pages"][page]["extract"]#wikiの説明文を参照mediawikiapiで取得したjsonから概要があるところにアクセス

挙動

参考にした記事

忘れたので調べておきます

まとめ

読みづらいですけど初心者なのでお許しください
まともなbotを作れてよかった
実用性はないと思う
ここわからない とかあったらコメントとかtwitterで言ってもらえれば120%返します