別棟備忘録4

*

xmlrpc で画像投稿

      2015/12/04

こちらのエントリーpythonとpandasでグラフを作成するで作成したグラフを、PythonからxmlrpcでWordPressへ投稿の固定ページに投稿することが目的。

参考文献・参考資料
基本的には はたけアーカイブ
http://hatakazu.hatenablog.com/entry/2012/07/17/213509

を参考にさせていただき、以前に作成したpythonのプログラムに グラフを作成する部分画像を投稿する部分を追記した。

ソースコード
import numpy as np
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
import pandas as pd
import serial

def str2date(x):
xstr = str(x)
year = int(xstr[0:4])
month = int(xstr[4:6])
day = int(xstr[6:8])
hour = int(xstr[8:10])
minute = int(xstr[10:12])
return datetime.datetime(year,month,day,hour,minute)

ser = serial.Serial(2, 9600,timeout=5)
print ser.portstr
“print ser.readline()”
LineData = ser.readline()
print LineData
“print ser.readline()”
import datetime
d = datetime.datetime.today()
print d
#calc
tmp = round(float(LineData[13:17]),1)
press = round(float(LineData[35:39])/10,1)
lx = 1000-int(LineData[93:96])
print tmp
print press
print lx
#save
f = open(“z://tmp.csv”, “a” )
f.write(”’%s,%s,%s,%s,%s,%s,%s,%s
”’% (d.year,d.month,d.day,d.hour,d.minute,tmp,press,lx)
)
f.close()
#gp
df = pd.read_csv(“z://tmp.csv”)

df = df[df[‘pa’] > 70]
df[[‘dt’]]=df[‘yy’]*100000000+df[‘mo’]*1000000+df[‘dd’]*10000+df[‘hh’]*100+df[‘mi’]

vstr2date=np.vectorize(str2date)
t=vstr2date(df[‘dt’])
df2 = pd.DataFrame({‘Time’ : t,
‘tmp’ : df[‘tmp’],
‘kpa’ : df[‘pa’],
})

fig, axes = plt.subplots(nrows=2)
df2.plot(x=[‘Time’],y=[‘tmp’],grid=True,ax=axes[0])
axes[0].set_title(‘Temperature’)
#axes[0].get_xaxis().set_major_formatter(mdates.DateFormatter(“%H:%M”))
df2.plot(x=[‘Time’],y=[‘kpa’],grid=True,ax=axes[1],c=’g’)
#axes[1].get_xaxis().set_major_formatter(mdates.DateFormatter(“%H:%M”))
axes[1].set_title(‘Pressure’)
plt.tight_layout()
plt.savefig(“z://gp2.png”)

#web_post
import xmlrpclib, httplib
#enc
file=open(“z://gp2.png”,”rb”)
file_enc=xmlrpclib.Binary(file.read())
file.close()

class ProxiedTransport(xmlrpclib.Transport):
def set_proxy(self, proxy):
self.proxy = proxy
def make_connection(self, host):
self.realhost = host
h = httplib.HTTP(self.proxy)
return h
def send_request(self, connection, handler, request_body):
connection.putrequest(“POST”, ‘http://%s%s’ % (self.realhost, handler))
def send_host(self, connection, host):
connection.putheader(‘Host’, self.realhost)

p = ProxiedTransport()
p.set_proxy(‘***.***.***.***:****’)

username =”tmp”
password =”password”
url=”https://bibo.capture.jp/xmlrpc.php”
server = xmlrpclib.ServerProxy(url,transport=p)
content = {}
content[‘post_title’] = “部屋の状況”
content[‘post_content’] = u”’
<span style=”color: #00b050; font-family: MS ゴシック; font-size: 18pt;”><strong>お部屋の物理量
</strong>
<span style=”font-family: MS ゴシック;”>  熱運動の激しさ: <span style=”font-size: 22pt;”><strong>%s + 273.15 K
</span>
<span style=”font-family: MS ゴシック;”>  壁が受ける圧力: <span style=”font-size: 22pt;”><strong>%s kPa</strong></span></span>
<span style=”font-family: MS ゴシック;”>  お部屋の明るさ: <span style=”font-size: 22pt;”><strong>%s</strong></span>
</span>
<span style=”font-family: MS ゴシック;”>                %s/%s/%s %s:%s 現在</span>
<a href=”https://bibo.capture.jp/wp-content/uploads/2015/11/gp2.png”><img class=”alignnone size-full wp-image-15889″ src=”https://bibo.capture.jp/wp-content/uploads/2015/11/gp2.png” alt=”gp2.png” width=”520″ height=”390″ /></a>
こんな感じで測定しています
<a href=”https://bibo.capture.jp/wp-content/uploads/2015/10/press.png”><img class=”alignnone size-medium wp-image-820″ src=”https://bibo.capture.jp/wp-content/uploads/2015/10/press-300×224.png” alt=”press” width=”300″ height=”224″ /></a>

参考エントリ
<a href=”https://bibo.capture.jp/?p=149″>気圧測定:BMP085とArduino</a> 2015.10.14
<a href=”https://bibo.capture.jp/?p=150″>PythonからxmlrpcでWordpressへ投稿</a> 2015.10.25
gp02.png
”’ % (tmp,press,lx,d.year,d.month,d.day,d.hour,d.minute)
content[‘post_type’] = “page”
content[‘post_status’] = “publish”
blog_id=1
post_id=4
#post_content
a=server.wp.editPost(blog_id,username,password,post_id,content)
#post_png
entry_id=server.wp.uploadFile(blog_id,username,password,
{
‘name’:”gp2.png”,
‘type’:”image/png”,
‘bits’:file_enc,
‘overwrite’:True
}

)
print a;
#raw_input()

ファイルはこちらtest5.py

実行してみると、アップロードはうまくいっているらしい、、しかし、いくつか問題が。

問題1 画像が上書き保存されず、末尾に番号がついてだんだん増えていってしまうこと。’overwrite’:Trueが効いていない。
対策1-1プラグインをOverwrite Uploadsを入れてみる。→改善せず。

なぜ? とGoogleに頼ると、以下のページにあたった。英語。googleで翻訳。
https://core.trac.wordpress.org/ticket/17604

対策1-2./wp-includes内にあるclass-wp-xmlrpc-server.php の
$filename = preg_replace(‘/^wpid\d+-/’, ”, $name);
$name = “wpid{$old_file->ID}-{$filename}”;
この2行が気を利かせている結果上書きされない。削除しましょう。再度実行。どうやら成功。勘違い。以下参照。

問題2 上書きはされるようになったが記事の投稿と画像の投稿のうち、コードが先にある方しか実行されていないことが発覚。おそらくエラーメッセージが出ていることが原因?
対策2-1 
実行ファイルを記事投稿のものと画像投稿のものに分けてタスクスケジューラで2つのプログラムを実行する対症療法。
記事の投稿 test2p.py
画像の投稿 test2-2p.py

問題3 問題1と関連するが、デフォルトでは画像は月ごとにフォルダ仕分けされるため、月をまたぐとリンク先が変わる。
対策3-1 Wordpressの設定から、画像ファイルの月別仕分けをやめる。ただし、ほかの部分への影響あり。
対策3-2 毎月1日にリンクを貼り直す。 現状とりあえずこちら。

問題4 固定ページ「部屋の状況」の「固定ページの編集ページ」にアクセスできなくなった。現状対策はなし。
Fatal error: Out of memory (allocated 249823232) (tried to allocate 71 bytes)

現状更新されているページはこちら 固定ページ「部屋の状況」
room

 

memo xmlrpcの機能一覧
http://jprogramer.com/wordpress/3600

 - Python