2. dcup
目的:複数の画像をアップロードして、それらを自動投稿する
ファイル名はxxx1.jpg ~ xxx20.jpgにする
urls.py |
urlpatterns = [ path(‘upload’, views.upload, name=’upload’),] |
models.py |
class Upload(models.Model): title = models.CharField(max_length=50) categories = models.TextField(blank=False,default=’1’) tags = models.TextField(blank=False,default=’1’) filename = models.CharField(max_length=100) number = models.IntegerField(blank=False) def __str__(self): return self.title |
forms.py |
from .models. import Uploadclass UploadForm(ModelForm): class Meta: model = Upload fields = [‘title’,’categories’,’tags’,’filename’,’number’] |
views.py |
import osimport requestsimport json def upload(request): if request.method == ‘POST’: form = UploadForm(request.POST) if form.is_valid(): form.save() title = request.POST[‘title’] categories = request.POST[‘categories’] tags = request.POST[‘tags’] filename = request.POST[‘filename’] content = ‘これは自動投稿テストです<br>’ for i in range(int(request.POST[‘number’])): file_path = ‘C:/Users/wiki1/Desktop/’ + filename + ‘/’ + str(i + 1) + ‘.jpg’ file_name = os.path.basename(file_path) if file_path.endswith(‘jpg’): contentType = ‘image/jpg’ if file_path.endswith(‘png’): contentType = ‘image/png’ if file_path.endswith(‘mp4’): contentType = ‘movie/mp4’ headers = { ‘Content-Type’: contentType, ‘Content-Disposition’: ‘attachment; filename=’ + file_name, } with open(file_path, ‘rb’) as f: img_data = f.read() res = requests.post( ‘https://9ml.fun/wp-json/wp/v2/media’, headers=headers, data=img_data, auth=(‘@9ml_fun’,’HudW qQKU OjHV guFg SZTS wKiD’), ) print(‘ステータスコードは’) print(res.status_code) media_info = res.json() content += ‘<img src=”’ + media_info[‘source_url’] + ‘“><br>’ # ここまでアップロードはバグなしで実行可能 # ここから自動投稿 post_data = { ‘title’: title, ‘content’: ‘<h2>見出し</h2><p>テスト</p>’, ‘categories’: [categories], ‘tags’: [tags], ‘status’: ‘draft’, } res = requests.post( f’https://9ml.fun/wp-json/wp/v2/posts’, json=post_data, headers={‘Content-type’: ‘application/json’}, auth=(‘@9ml_fun’,’mdyq A18c 9fi5 KFl5 mOLR Ibax’) ) return redirect(‘app:index’) else: form = UploadForm() return render(request, ‘app/upload.html’, {‘form’:form}) |
TabError: inconsistent use of tabs and spaces in indentation
はスペースとタブが混在しているために起こる
media_info = res.json()
content += ‘<img src=”’ + media_info[‘source_url’] + ‘“><br>’
とすると、7枚以上のファイルをアップロードした時、ブラウザエラーが起きるので次のように変更した
content += ‘<img src=”https://9ml.fun/wp-content/uploads/’ + file_name + ‘”><br>’
ファイルの拡張子を連番に変える際、
フォルダ内にjpgだけでなくpngやwebpも入っていた場合、
場合分けなしでコードを実行するとブラウザエラー「パイプが~~」が発生する
自動投稿する際は
WordPressのパーマリンク設定で
カスタム構造のhttps://9ml.fun/%category%/%postname%/にして「保存」しないと
自動投稿できず404エラーになる
テンプレートページに行ったときにTemplateDoesNotExistとなる場合はDIRS内のパスが間違っている
’DIRS’:[]の状態では、manage.pyと同階層のtemplatesフォルダ内が探索される
‘APP_DIRS’:Trueとなっていれば、
’DIRS’の次にINSTALLED_APPS内のtemplatesが探索される
INSTALLED_APPS内には’app’も含まれるのでapp内のtemplatesフォルダが探索される
ブラウザのURLを見てDIRSを書くこと
settings.py |
TEMPLATES = [{ ‘DIRS’: [os.path.join(BASE_DIR, ‘app/templates/app’)],}] |
res.status_codeが403となりエラーになる
Conoha管理画面のWAFをONにしたままだと
SQLインジェクションという悪意攻撃でhttps://9ml.fun/wp-json/wp/v2/mediaにアクセスした扱いになるので、OFFにした
画像投稿のrequests.postでf’http~~’とすると401エラーになるので、fは不要