Python3.xとSeleniumでFc2ブログに自動投稿するよ
どうも、以前の記事ではXML-RPCの機能を使ってFc2ブログに記事を投稿しました。しかし、この方法だと記事の本体部分はタイトルと本文だけで、追記やタグに記述することはできません。
そこで今回はテストツールであるSeleniumを使ってブラウザ自動操作することでFc2に記事を投稿してみようと思います。今回の記事でもSeleniumはすでに環境構築ができているものとして書いていくので、まだの方は以前の記事なんかを参考に整えておいてください。
OS : Ubuntu 16.04 LTS
OS : CentOS 7
Python : 3.5.2
Selenium : 2.53.6
1. config.pyファイルの作成
さて、まずはコンフィグファイルを作成します。正直作成する意味はないのですが、複数サイトに投稿する場合は、ほぼほぼこのファイルを量産するだけになるので便利です。このファイルを次に書くプログラムのファイルと同じディレクトリに入れておいてください。
1 2 3 4 5 6 7 |
#coding:utf-8 # fc2 USER_ID = 'ご自身のブログのID' PASSWORD = 'パスワード' LOGIN_PAGE_URL = 'https://fc2.com/ja/login.php?ref=blog' EDIT_PAGE_URL = 'http://admin.blog.fc2.com/control.php?mode=editor&process=new' |
ちなみに、普段はDBなどのログイン情報もこのコンフィグファイルに記述しています。パスワードが直書きになりますが、利便性には勝てません。うまい管理方法はありませんでしょうか。
2. 今回書いたコード
さて、次が今回のメインになるコードを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#coding : utf-8 import time import MySQLdb from selenium import webdriver import config def login_fc2(): try: i = b.find_element_by_id('id') i.send_keys(config.USER_ID) i = b.find_element_by_id('pass') i.send_keys(config.PASSWORD) i.submit() time.sleep(5) except: def edit_post(title='', txt1='', txt2='', tags=[]): try: b.find_element_by_css_selector('#change_normal_link img').click() except: try: # タイトルの入力 i = b.find_element_by_id('entry_title') i.send_keys(title) # "記事を書く"の入力 i = b.find_element_by_id('body') i.send_keys(txt1) b.save_screenshot("test.png") # "続きを書く"の入力 i = b.find_element_by_id('extend') i.send_keys(txt2) # タグの入力 i = b.find_element_by_id('usertag') tag_text = "" for n, tag in enumerate(tags): # ブログの仕様上タグは10件までなので対策 if 10 < n: break tag_text += tag + ' ' i.send_keys(tag_text[:-1]) # 投稿ボタンを押す i = b.find_element_by_css_selector('input[type="submit"]').click() time.sleep(3) except Exception as inst: if __name__ == '__main__': try: # ブラウザの起動 # b = webdriver.Chrome('./chromedriver') # b = webdriver.PhantomJS('./phantomjs') b = webdriver.PhantomJS() b.set_window_size(1124, 850) except Exception as inst: quit() try: # ページ推移 b.get(config.LOGIN_PAGE_URL) time.sleep(1) # ログイン状況の確認 if 'login' in b.current_url: login_fc2() time.sleep(1) # 記事編集ページに移動 b.get(config.EDIT_PAGE_URL) time.sleep(1) # 投稿する本IDの決定 book_id = get_book_id() # 記事情報の取得 title = "TITLE" tags = ["tag1", "tag2", "tag3"] # 本文の作成 txt1 = "本文 _(┐「ε:)_" # 追記の作成 txt2 = "追記 _:(´ཀ`」 ∠):" # 記事投稿 edit_post(titles, txt1, txt2, tags) except Exception as inst: print(type(inst)) print(inst.args) finally: b.quit() |
記事を構成する部分はtitle, tags, txt1, txt2です。これをedit_postに引数で渡すことで記事を投稿する処理を行います。正直、蛇の足が書いてある割にはコードの構成が悪い気がします。まぁ、動作確認ということで目をつぶってください。
コーディングで分からないことがあれば
プログラミングや環境構築で分からないことがあったら『teratail』というエンジニア特化型のQ&Aサービスがオススメです。自分もどうしても分からないことがあったら、時々質問しにいきますが、かなりニッチな質問にも意外と早く回答がつくのでとても頼もしいです。という宣伝でした。
おわりに
さて、ここまでテキトーに書いてきました。今回は最低限の機能ということで掲載しました。投稿を完全に自動化したかったらこのコードにDBなどから情報を取ってくる処理を追加すればいいと思います。ちなみに、この方法で記事を投稿するのは規約的に大丈夫かわからないので、ご利用の際は自身でご確認ください。