4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-05

#はじめに
使用言語 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から概要があるところにアクセス
#挙動
無題.png
#参考にした記事
忘れたので調べておきます
#まとめ
読みづらいですけど初心者なのでお許しください
まともなbotを作れてよかった
実用性はないと思う
ここわからない とかあったらコメントとかtwitterで言ってもらえれば120%返します

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?