import urllib.request, requests, urllib.parse, time

def recup_cat(url) :
    liste= []
    file = urllib.request.urlopen(url)
    for i in file :
        i = i.strip()
        if i.startswith(b'<span class="s2">&quot;title&quot;</span><span class="o">:</span> <span class="s2">') :
            i = i.split(b'>')
            i = i[5].decode('UTF-8')
            i = i.split('<')
            i = i[0].split(":")
            i = i[1].split("&q")
            i = i[0]
            liste.append(i)
            
    return liste

#Permet la récupération du titre en fonction du flux Atom de WN
def recup_titre(url) :
    file = urllib.request.urlopen(url)
    a = 0
    for j in file :
        if a == 11 :
            j = j.decode('UTF-8')
            print(j)
            j = j.split('>')
            j = j[1].split('<')
            titre = j[0]
            
            return {"titre" : titre}
        a = a + 1

#Permet la récupération d'un titre différent en cas de renommage
def recup_redirect(titre) : 
    titre2 = urllib.parse.quote(titre)
    url = 'https://fr.wikinews.org/w/index.php?title='+titre2+'&action=info&utf8=1'
    file = urllib.request.urlopen(url)
    for i in file :
        if i.startswith(b'<tr id="mw-pageinfo-redirectsto"><td style="vertical-align: top;">Rediriger vers</td>') :
            i = i.decode('UTF-8')
            i = i.split('>')
            i = i[5].split('<')
            titre = i[0]
    
    return {"titre" : titre}


#Permet la récupération du texte 
def recup_text(titre):
    
    titre = urllib.parse.quote(titre)
    #URL API récup texte
    url = "https://fr.wikinews.org/w/api.php/w/api.php?action=query&format=json&uselang=fr&prop=extracts&titles="+titre+"&utf8=1&ascii=1&exsentences=4&exlimit=1&exintro=1&explaintext=1"
    #print (url)
    file = urllib.request.urlopen(url)
    
    for j in file :
        j = j.decode('UTF-8')
        j = j.split('"')
        titre = j[17]
        pos = j[21].find('.')
        j = j[21]
        texte = j[pos+4:]
        date = j[:pos]
        
        return {"texte" : texte, "titre" : titre, "date" : date}
    
#Permet la récupération de l'image
def recup_image(titre) :
    titre = urllib.parse.quote(titre)
    #URL API récup image :
    url2 = "https://fr.wikinews.org/w/api.php?action=query&prop=images&titles="+titre+"&format=json&utf8=1"
    #print (url2)
    
    file = urllib.request.urlopen(url2)
    
    for j in file :
        
        j = j.decode('UTF-8')
        try :
            j = j.split('images')
            j = j[1].split('title')
            j = j[1].split('"Fichier:')
            j = j[1].split('"')
            image = j[0]
            
            if image == "Fleche-defaut-droite-gris-50.png" : image = 'Wikinews-logo.png'
            if image == "Feed-icon.svg" : image = 'Wikinews-logo.png'
            if image == "Ambox outdated content.svg" : image = 'Wikinews-logo.png'
                
        except : image = 'Wikinews-logo.png'

        return {"image" : image}


    
urlcat = 'https://fr.wikinews.org/w/api.php?action=query&utf8=1&list=categorymembers&cmtitle=Cat%C3%A9gorie%3ACat%C3%A9gorie+avec+article+principal&cmlimit=500'



k = 0
#URL flux atom WN
url3 = 'https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only'

while k < 10 :  
    try :
        while k < 10 :

            liste = recup_cat(urlcat)
            cat = 0 
            for a in liste :
                cat_titre = urllib.parse.quote(liste[cat])
                print(liste[cat])
                url_test = 'https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7C'+cat_titre+'&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only'
                cat = cat + 1
                print (url_test)
    
                retour_titre = recup_titre(url_test)
                print(retour_titre)
                try :
                    titre = retour_titre["titre"]
        
                    retour_redirect = recup_redirect(titre)
                    titre = retour_redirect["titre"]
        

                    #Query API catégories dans [[Catégorie:Catégorie avec article principal]]
    

        
                    retour_texte = recup_text(titre)
                    texte = retour_texte["texte"]
            
                    texte = " ".join(texte.split("\\n"))
            
                    longueur_texte = len(texte)
                    print(len(texte))
    
                    titre = retour_texte["titre"]
                    date = retour_texte["date"]
                    longueur_date = len(date)

                    retour_image = recup_image(titre)
                    image = retour_image["image"]
        

                    f1 = str('<!-- DO NOT ALTER THE TWO LINES BELOW -->')
                    f2 = str('</div>')
                    f3 = str('<div style="text-align: justify;padding: .5em .5em .5em;">')
                    f4 = str('<!-- DO NOT ALTER THE TWO LINES ABOVE -->')
    
                    bloc1 = str('{{Article principal')
                    bloc2 = str('|modif=Page:'+liste[cat-1]+'/Article principal')
                    bloc3 = str('|Titre='+ titre)
                    bloc4 = str('|Image='+ image)
                    bloc5 = str('|date='+ date)
                    bloc6 = str('|Image width=150')
                    bloc7 = str('|Image text=')
                    bloc8 = str('|Synopsis='+ texte)
                    bloc9 = str('}}')
    

                    {"1" : bloc1, "2" : bloc2,"3" : bloc3,"4" : bloc4,"5" : bloc5,"6" : bloc6,"7" : bloc7,"8" : bloc8, "9" : bloc9, "f1" : f1, "f2" : f2,"f3" : f3,"f4" : f4}

                    contenu = str(f1+"\n"+f3+"\n"+f4+"\n"+bloc1+"\n"+bloc2+"\n"+bloc3+"\n"+bloc4+"\n"+bloc5+"\n"+bloc6+"\n"+bloc7+"\n"+bloc8+"\n"+bloc9+"\n"+f2)
                except : 
                    longueur_texte = 0
        
                if liste[cat-1] == 'Triathlon' :
                    longueur_texte = 0
            
                if longueur_date > 25 : 
                    longueur_texte = 0
            
                if longueur_texte > 230 : 
                    username = 'Matthobot'
                    password = 'Matthobot@onemb59hk1offac6qpdboa65vueo6jba'
                    baseurl = 'https://fr.wikinews.org/w/'
                    summary = '[Action Bot] Mise à jour article principal'
                    message = contenu
                    #sectiontitle = bloc1
                    title = 'Page:'+liste[cat-1]+'/Article principal'

                    # Login request
                    payload = {'action': 'query', 'format': 'json', 'utf8': '', 'meta': 'tokens', 'type': 'login'}
                    r1 = requests.post(baseurl + 'api.php', data=payload)

                    #print('1')
                    # login confirm
                    login_token = r1.json()['query']['tokens']['logintoken']
                    payload = {'action': 'login', 'format': 'json', 'utf8': '', 'lgname': username, 'lgpassword': password, 'lgtoken': login_token}
                    r2 = requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)

                    print('2')
                    # get edit token2
                    params3 = '?format=json&action=query&meta=tokens&continue='
                    r3 = requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies)
                    edit_token = r3.json()['query']['tokens']['csrftoken']

                    #print('3')
                    edit_cookie = r2.cookies.copy()
                    edit_cookie.update(r3.cookies)
                    #print (edit_token)

                    # save action
                    payload = {'action': 'edit', 'assert': 'user', 'format': 'json', 'bot': '1', 'utf8': '', 'text': message,'summary': summary, 'title': title, 'token': edit_token}
                    r4 = requests.post(baseurl + 'api.php', data=payload, cookies=edit_cookie)
            
                    print (contenu)
        
                time.sleep(2)
            
    except :
        print('EXCEPT')
        time.sleep(200)
Abkhazie
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAbkhazie&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Décès de Sergueï Bagapch, président d'Abkhazie en exercice</title>

{'titre': "Décès de Sergueï Bagapch, président d'Abkhazie en exercice"}
298
2
<!-- DO NOT ALTER THE TWO LINES BELOW -->
<div style="text-align: justify;padding: .5em .5em .5em;">
<!-- DO NOT ALTER THE TWO LINES ABOVE -->
{{Article principal
|modif=Page:Abkhazie/Article principal
|Titre=Décès de Sergueï Bagapch, président d'Abkhazie en exercice
|Image=Black Ribbon.svg
|date=30 mai 2011
|Image width=150
|Image text=
|Synopsis= Le président de l'Abkhazie, Sergueï Bagapch, est décédé hier des suites d'un cancer du poumon, a annoncé le porte-parole de la présidence abkhaze, Kristian Bjania. « Les médecins ont confirmé qu'il avait des tumeurs malignes au poumon droit. Les métastases ont atteint d'autres organes du corps ».
}}
</div>
Afrique
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAfrique&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Championnat du Super Rugby 2019 : les résultats de la treizième journée</title>

{'titre': 'Championnat du Super Rugby 2019 : les résultats de la treizième journée'}
109
Alaska
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAlaska&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Séisme de magnitude 7,9 dans le Golfe de l'Alaska</title>

{'titre': "Séisme de magnitude 7,9 dans le Golfe de l'Alaska"}
327
2
<!-- DO NOT ALTER THE TWO LINES BELOW -->
<div style="text-align: justify;padding: .5em .5em .5em;">
<!-- DO NOT ALTER THE TWO LINES ABOVE -->
{{Article principal
|modif=Page:Alaska/Article principal
|Titre=Séisme de magnitude 7,9 dans le Golfe de l'Alaska
|Image=Wikinews-logo.png
|date=23 janvier 2018
|Image width=150
|Image text=
|Synopsis= Ce matin, l'Institut d'études géologiques des États-Unis a enregistré un séisme de magnitude 7,9 dans le Golfe d'Alaska, à dix kilomètres de profondeur, à peu près 280 km au sud-est de la ville de Kodiak. L'estimation initiale de la magnitude était 8,2. Le tremblement de terre a bien été ressenti sur le littoral de l'Alaska.
}}
</div>
Algérie
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAlg%C3%A9rie&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Algérie : Internet bloqué dans tout le pays pour empêcher la triche lors des examens</title>

{'titre': 'Algérie : Internet bloqué dans tout le pays pour empêcher la triche lors des examens'}
0
Allemagne
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAllemagne&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Patinage artistique : résultats des championnats d'Allemagne 2018-2019</title>

{'titre': "Patinage artistique : résultats des championnats d'Allemagne 2018-2019"}
0
Amérique
https://fr.wikinews.org/w/index.php?title=Special:NewsFeed&feed=atom&categories=Article_publi%C3%A9%7CAm%C3%A9rique&notcategories=Article_en_d%C3%A9veloppement&namespace=0&count=15&ordermethod=categoryadd&stablepages=only
		<title>Le Brésil montre la haute gastronomie et ferme de bonnes affaires en France</title>

{'titre': 'Le Brésil montre la haute gastronomie et ferme de bonnes affaires en France'}
759
2
<!-- DO NOT ALTER THE TWO LINES BELOW -->
<div style="text-align: justify;padding: .5em .5em .5em;">
<!-- DO NOT ALTER THE TWO LINES ABOVE -->
{{Article principal
|modif=Page:Amérique/Article principal
|Titre=Le Brésil montre la haute gastronomie et ferme de bonnes affaires en France
|Image=Americas (orthographic projection).svg
|date=15 février 2019
|Image width=150
|Image text=
|Synopsis= Avec des ingrédients tels que des racines de la forêt amazonienne, du tucupi noir, du puxuri (type condiment autochtone), du tapioca hydraté du lait de coco et de la racine de coriandre, le Brésil s'est démarqué avec brio dans le plus grand concours de haute gastronomie au monde, le Bocuse d'Or, Il s'est déroulé à Lyon, en France, à la fin du mois dernier. Avec une équipe de grands chefs, le Brésil figurait partie les 24 finalistes du concours, qui réunissait le meilleur de la cuisine du monde à la fin du mois dernier. Pour démontrer que les saveurs brésiliennes peuvent plaire à différents types de goûts/palais, les chefs cuisiniers de l'équipe brésilienne et une équipe réputée ont élaboré des recettes sans précédent et ont interagi avec le public.
}}
</div>