Inspection of the forums and threads generated by MyBB shows that each forum has an id, and each thread has an id. The URL to a forum thread only contains the thread id: e.g.https://peter-thomson.com/mybb/showthread.php?tid=593
So first of all I add a column for the thread id to my own database table that holds my web pages, and a column for the forum id to the database table that holds my categories of pages.( This is on my local system ).
Next add the Python library called Selenium to your local python installation.
I have installed MyBB on my server and we are now ready. I have created a couple of forums on the server using the admin interface and noted the forum ids. Automating the creation of forums will come later once the automation of thread creation is fully working.
The script runs on your local system, accesses MyBB on your remote server, and updates your database on your local system. When you run the script successfuly you should see the browser window quickly updating each thread in turn
#!/usr/bin/env python3
# coding=utf-8
# copyright Peter Thomson 2015,2018
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses.
GPL3=u''' This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses
'''
thisversion = '1.01'
import os
import os.path
import cgi
import webbrowser
import sqlite3
import string
import requests
import http.cookiejar
import re
import datetime
import imaplib
import codecs
import urllib
import sys
from datetime import date, timedelta
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
global browser
browser = webdriver.Firefox()
ti = datetime.datetime.now()
timestamp = ("Current date & time = %s" % ti)
######
myusername= '*******' #this is your admin username
mypassword = '''*********************'''#this is your admin password
######
def setforumthreads():
#####################
mycategory = 'dolomites' #for this tutorial these have been created first by the admin
forumid_for_mycategory = '11' # and the forum id noted when the forum is created in the forum management page
#####################
ti = datetime.datetime.now()
timestamp = ("Current date & time = %s" % ti)
url='https://peter-thomson.com/mybb/member.php?action=login' #this is the URL to login to your installation of MyBB on your server
payload={'email': myusername , 'password' : mypassword }
browser.get( url )
time.sleep(3)
username = browser.find_element_by_name("username")
password = browser.find_element_by_name("password")
username.send_keys(myusername)
password.send_keys(mypassword)
buttons = browser.find_elements_by_css_selector("input.button");
buttons[2].click()
db = sqlite3.connect('website2.mybookshelf' ) #I am using an SQLite database for my web page details, in the same folder as this script on my local system
cursor = db.cursor()
cursor.execute('''SELECT page_name, book, page_heading, thread_id FROM bookpages where book = ? ''',(mycategory,)) #These are the details about each web page that I need in order to create a new forum thread for each page. book is the category of web page.
all_rows = cursor.fetchall()
for pmrow in all_rows:
page_name=pmrow[0]
book=pmrow[1]
page_heading=pmrow[2]
thread_id=pmrow[3]
print("checking "+ page_name + str(thread_id) )
if thread_id is None:
#if the thread has already been created and stored in the thread_id field, don't create a new thread
browser.get( 'https://peter-thomson.com/mybb/newthread.php?fid='+ forumid_for_mycategory) # needs to be a forum where postings are permitted, not a category
print ('Got page ' )
mysubject= page_heading # the thread subject is going to be the same as the page heading
mymessage = 'This thread is for the discussion of: '+ page_heading #and the first thread message content will use this format
subject = browser.find_element_by_name('''subject''')
subject.send_keys(mysubject)
print('inserted subject')
editor_frame = browser.find_element_by_xpath('''//*[@id="content"]/div/form/table[1]/tbody/tr[5]/td[2]/div/iframe''')#//*[@id="content"]/div/form/table[1]/tbody/tr[5]/td[2]/div/iframe
browser.switch_to.frame(editor_frame)
editor_body = browser.find_element_by_xpath("//body") #/html/body
editor_body.click()
editor_body.send_keys(mymessage)
print('inserted message')
browser.switch_to_default_content()
buttons = browser.find_element_by_xpath('''//*[@id="content"]/div/form/div/input[1]''');
buttons.click()
#the thread has now been created, and we want to collect the new thread id from the page, but we must wait for the page to update
timeout = 5
try:
element_present = EC.presence_of_element_located((By.ID, 'posts_container'))
WebDriverWait(browser, timeout).until(element_present)
except TimeoutException:
print( "Timed out waiting for page to load" )
mypage = browser.page_source
m=re.search('href="newreply.php\?tid=(.+?)"' , mypage , re.DOTALL ) #extract the new thread id
forumlink = 'unchanged'
tid=''
if m is not None:
tid = m.group(1)
print('New Thread is ' +tid )
cursor.execute('''UPDATE bookpages SET thread_id = ? WHERE book= ? AND page_name = ? ''', (tid, book, page_name ))#save the new thread id to the table in my local database
db.commit()
return "<h1>all done</h1>"
setforumthreads()
print("All Done")
Now all the new threads have been completed and the thread id stored in your web page database you need to update each page and insert the appropriate thread id into an iframe template for each page.