Python上传文件到WordPress

jdg4fx2g  于 2024-01-06  发布在  WordPress
关注(0)|答案(3)|浏览(238)

我试图上传文件到一个WordPress网站使用Python.到目前为止,它看起来像我不能使用API与会话cookie没有扩展.所以在这一点上,我试图按照沿着以下职位
使用请求登录WordPress- Python3
Uploading of image to WordPress through Python's requests
这就是我目前所知道的。

  1. #!/usr/bin/python3
  2. import sys, requests
  3. f = 'test.txt'
  4. user='username'
  5. password='password'
  6. url1='https://example.com/wp-login.php'
  7. url2='https://example.com/wp-admin/media-new.php'
  8. headerauth= {'Cookie':'wordpress_test_cookie=WP Cookie check'}
  9. dataauth = {'log':user, 'pwd':password, 'wp-submit':'Log In'}
  10. dataupload = {'post_id': '0', '_wp_http_referer': '/wp-admin/media-new.php', 'action': 'upload_attachement', 'html-upload': 'Upload'}
  11. image = {'async-upload':('test.txt', open(f, "rb"))}
  12. session1=requests.session()
  13. r1 = session1.post(url1, headers=headerauth, data=dataauth)
  14. print(r1)
  15. r2 = session1.get(url2)
  16. print(r2)
  17. r3 = session1.post(url2, data=dataupload, files=image)
  18. print(r3)

字符串
当运行这个程序时,我得到了以下响应,显然最后一个是有趣的。

  1. ./upload.py
  2. <Response [200]>
  3. <Response [200]>
  4. <Response [403]>


我也试过在手动上传文件后从Chrome中提取数据字段,直接发布到UBC-upload.php,结果类似。
更新:我收到的回复页面有以下标题。

  1. <title>Something went wrong.</title>
  2. ...
  3. <body id="error-page">
  4. <div class="wp-die-message">The link you followed has expired.</div>
  5. </body>


我还添加了nonce值后,挖掘了周围的网页源代码。

  1. <input type="hidden" id="_wpnonce" name="_wpnonce" value="74bdb561c5">


这是我加的。

  1. r2 = session1.get(url2)
  2. test = re.search('value="[0-9a-z]{10}"', r2.text)
  3. nonce = re.search('[0-9a-z]{10}', test.group(0))
  4. nonce = nonce.group(0)
  5. dataupload = {'post_id':'0', '_wp_http_referer':'/wp-admin/media-new.php', '_wpnonce':nonce, 'action':'upload_attachement', 'html-upload':'Upload'}


仍然没有运气。我还注意到,与我的基于浏览器的会话相比,缺少cookie。我将假设我实际上没有进行身份验证。

kzipqqlq

kzipqqlq1#

您可能需要在请求中添加更多标头。
标题可以在Network > Headers > Request Headers of the Developer Tools.中找到(按F12切换它。)

wlsrxk51

wlsrxk512#

使用了错误的随机数。要提取正确的随机数,请使用以下命令并发布到Media-upload.php。关键是从media-new.php页面提取form _wpnonce。
如果你不从表单参数中提取,那么你最终可能会得到一打其他随机数中的一个。

  1. test = re.search('"multipart_params":.*_wpnonce":"[0-9a-z]+"', r1.text)
  2. nonce = re.search('(?<=_wpnonce":")[0-9a-z]{10}', test.group(0))
  3. nonce = nonce.group(0)

字符串
完整的代码是

  1. #!/usr/bin/python3
  2. import sys, requests, re
  3. f = 'test.txt'
  4. user='user'
  5. password='password'
  6. url1='https://example.com/wp-login.php'
  7. redirecturl='https://example.com/wp-admin/media-new.php'
  8. url2='https://example.com/wp-admin/async-upload.php'
  9. headerauth= {
  10. 'Cookie':'wordpress_test_cookie=WP Cookie check; ROUTEID=.1',
  11. 'Host':'example.com',
  12. 'Content-Type': 'application/x-www-form-urlencoded'
  13. }
  14. dataauth = {
  15. 'log':user,
  16. 'pwd':password,
  17. 'wp-submit':'Log In',
  18. 'redirect_to': redirecturl,
  19. 'testcookie': 1
  20. }
  21. image = {'async-upload':('test.txt', open(f, "rb"))}
  22. testimage = open(f, "rb")
  23. session1=requests.session()
  24. session1.get(url1)
  25. r1 = session1.post(url1, headers=headerauth, data=dataauth)
  26. test = re.search('"multipart_params":.*_wpnonce":"[0-9a-z]+"', r1.text)
  27. nonce = re.search('(?<=_wpnonce":")[0-9a-z]{10}', test.group(0))
  28. nonce = nonce.group(0)
  29. uploadheaders = {
  30. 'Connection': 'keep-alive',
  31. 'Referer': 'https://example.com/wp-admin/upload.php',
  32. 'Sec-Fetch-Dest': 'empty',
  33. 'Sec-Fetch-Mode': 'cors',
  34. 'Sec-Fetch-Site': 'same-origin'
  35. }
  36. dataupload = {
  37. 'name': 'test.txt',
  38. 'action': 'upload-attachement',
  39. '_wpnonce': nonce,
  40. 'wpmf_folder': '0',
  41. }
  42. r2 = session1.post(url2, data=dataupload, headers=uploadheaders, files=image)

展开查看全部
yx2lnoni

yx2lnoni3#

在WordPress API v2上通过Python 3脚本测试了多种文件类型后,我们发布了一个要点。它上传到WordPress默认上传目录,当然您可以在其中修改其设置:

  1. WordPress Dashboard > Settings > Media

字符串
该脚本也以安全的方式处理令牌。
希望对你也有用:

  1. ### upload.py
  2. import os
  3. import base64
  4. import requests
  5. from credentials import get_wp_access
  6. def upload_file(relative_path, caption, destination):
  7. # Get the absolute path to the directory containing this script
  8. project_dir = os.path.dirname(os.path.abspath(__file__))
  9. # Combine the project directory with the relative path to get the full system path
  10. file_path = os.path.join(project_dir, relative_path)
  11. api_url, username, password = get_wp_access(destination)
  12. credentials = username + ':' + password
  13. token = base64.b64encode(credentials.encode())
  14. json_header = {'Authorization': 'Basic ' + token.decode('utf-8')}
  15. media = {'file': open(file_path, "rb"), 'caption': caption}
  16. response = requests.post(api_url + "media", headers=json_header, files=media)
  17. print(response.text)
  18. # Example usage with a path relevant to the project directory
  19. upload_file('relational/path/to/file.pptx', 'Sample caption', 'site_1')


在另一个文件中:

  1. ### credentials.py
  2. destinations = {
  3. "site_1": {
  4. "api_url": "https://example-1.com/wp-json/wp/v2/",
  5. "username": "wp_username",
  6. "password": "XXXX XXXX XXXX XXXX XXXX XXXX"
  7. },
  8. "site_2": {
  9. "api_url": "https://example-2.com/wp-json/wp/v2/",
  10. "username": "wp_username",
  11. "password": "XXXX XXXX XXXX XXXX XXXX XXXX"
  12. },
  13. "site_3": {
  14. "api_url": "https://example-3.com/wp-json/wp/v2/",
  15. "username": "wp_username",
  16. "password": "XXXX XXXX XXXX XXXX XXXX XXXX"
  17. },
  18. "site_4": {
  19. "api_url": "https://example-4.com/wp-json/wp/v2/",
  20. "username": "wp_username",
  21. "password": "XXXX XXXX XXXX XXXX XXXX XXXX"
  22. },
  23. "site_5": {
  24. "api_url": "https://example-5.com/wp-json/wp/v2/",
  25. "username": "wp_username",
  26. "password": "XXXX XXXX XXXX XXXX XXXX XXXX"
  27. },
  28. # More websites if needed...
  29. }
  30. def get_wp_access(destination):
  31. access_info = destinations.get(destination, {})
  32. api_url = access_info.get("api_url", "")
  33. username = access_info.get("username", "")
  34. password = access_info.get("password", "")
  35. return api_url, username, password


使用这个脚本,你可以有多个WordPress网站的字典,并更新他们都与一个单一的功能。如果你想有一个所有在一个模块,随时合并的脚本在一起。
The Gist on GitHub

展开查看全部

相关问题