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

はスペースとタブが混在しているために起こる

https://daeudaeu.com/python-taberror

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は不要