1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python のプログラムでPukiWiki にファイルを Upload

Last updated at Posted at 2024-12-27

はじめに

Bot Computing/Wiki IoT というのをやっています。これは、PukiWikiのページにかかれたスクリプトをIoTのEdge端末が実行し、実行結果をPukiWikiのページに書き加える、というものです。Edge端末がWikiのページの記述で遠隔操作されるBot となります。これをWiki Botと呼んでいます。

2024年1月には、Raspberry Pi Pico をWiki Botとして使えるようにしました。

その後、Wiki Botのプログラムを Python でも書いて、Raspberry PiでPython版のWiki Botを動かすことができるようになりました。

いままでは、Wiki Botは、PukiWikiのテキストページのみの読み書きを行っていましたが、音声や画像も扱えたら良いなと思っていました。そこで、今回、Wiki Botに音声・画像をWiki ページにuploadする機能を付け加える準備として、PukiWikiのページに
画像ファイルを添付するプログラムを作成することができたので、記録しておきたいと思います。

なお、Wiki Botを作る以前は、PukiWikiのプラグインとして Javaのアプレットを使って、音声や画像をテキストデータに変換してPukiWikiのページに保存することをやっていたのですが、Java アプレットが使えなくなってしまって、それができなくなってしまっていました。

プログラム

Pico Wiki Driver を作った時と同様に、WireSharkでPukiWikiのページでファイルをuploadしたときのpostのデータをダンプ・解析するなどして作成しました。

import requests
from requests_toolbelt import MultipartEncoder

import mimetypes
file_Name = '<uploadする画像などのファイル名>'
file_dir='<uploadするファイルがあるpath>'
file_path=file_dir+file_Name

# MIMEタイプの定義
#XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
MIMETYPE = mimetypes.guess_type(file_path)[0]
print('file_path='+file_path)

# ファイル名とデータの取得
file_Data_Binary = open(file_path, 'rb').read()

# アップロード先のURL
url = '<PukiWikiサーバのURL>' 
page = '<ページ名>'

# アップロードするファイルの情報を辞書に格納
files = {'attach_file': (file_Name, file_Data_Binary, MIMETYPE),
         'encode_hint': '',
         'pass': '<adminパスワード>',
         'refer': page,
         'pcmd': 'post',
         'plugin': 'attach'}

m = MultipartEncoder(files)

hx={'Content-Type': m.content_type,
#    'Accept:': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Referer': url+'?'+'plugin=attach&pcmd=upload&page='+page
#    'Accept-Language': 'ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7'
}

# ファイルのアップロード
response = requests.post(url, data=m, headers=hx)

# レスポンスの表示
print(response.status_code)
print(response.content)

wfile_path=file_dir+'return.html'
result_file= open(wfile_path, 'w')
result_file.write((response.content).decode(encoding='utf-8'))

参考ページ等

以下のページなどを参考にさせていただきました。感謝します。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?