API vk Python gebruiken: Een VKontakte-muur downloaden. VKontakte-reinigingsprogramma

Ik merk al lang dat gegevens op sociale netwerken slecht worden opgeslagen. Een door u geplaatste repost zal bijvoorbeeld leeg zijn als de auteur van het originele bericht deze verwijdert. Recente problemen met audio-opnamen in VK waren de druppel en ik besloot alle gegevens die van belang zouden kunnen zijn in het geval van een nucleaire oorlog lokaal op te slaan. Zoeken kant-en-klare oplossingen, Ik vond niets dat bij mij paste, dus binnen een paar dagen was er een Python-script geschreven.

Doelen

Bewaar alles wat je kunt: audio-opnamen, documenten, muren. Je moet alle bijlagen bij berichten van de muur verwijderen, en opmerkingen bij alle bijlagen zijn ook niet overbodig. Dit is minimaal nodig zodat alle berichten met muziek en reacties waar vrienden goede nummers of katten hebben gestuurd, worden opgeslagen. Ik zal meteen zeggen dat er voor mijn doeleinden geen leesbare back-up was van aanvullende informatie (vind-ik-leuks, tijdstip waarop het bericht is gemaakt, enz.).

Ga aan het werk!

Creatieproces soortgelijke toepassing Het is al meer dan eens beschreven op Habré, dus ik zal niet alle details herhalen, ik zal de stappen van het werk kort beschrijven en ook een paar woorden zeggen over de problemen. Om te voorkomen dat het artikel overladen wordt met bronnen, zal er aan het einde een link naar github staan.
Overwegingen tijdens de ontwikkeling
  • Allereerst moet je jezelf pakken applicatie-id. Het is belangrijk dat het type zelfstandig, anders zijn sommige vk API-methoden niet beschikbaar.
  • Ook hebben wij de id nodig van de gebruiker wiens gegevens wij opslaan. Je kunt de jouwe vinden op de instellingenpagina
  • Om de applicatie te laten werken, heb je gebruikerstoestemming nodig, of beter gezegd: toegangstoken. Er is geen directe, niet-interactieve manier om een ​​token te verkrijgen; u kunt de autorisatiepagina ontleden, maar het is gemakkelijker om de gebruiker te vragen op een knop in de browser te klikken en de URL te kopiëren. De functie auth() is hiervoor verantwoordelijk:
    url = "https://oauth.vk.com/oauth/authorize?" + \ "redirect_uri=https://oauth.vk.com/blank.html&response_type=token&" + \ "client_id=%s&scope=%s&display=wap" % (args.app_id, ","".join(args.access_rights ) ) print("Open deze url:\n\n\t()\n".format(url)) raw_url = raw_input("Verleen toegang tot uw acc en kopieer de resulterende URL hier: ") res = re.search ( "access_token=(+)", raw_url, re.I)
  • VK API-verzoeken hebben een limiet: niet meer dan vijf per seconde. Als u te vaak contact opneemt met de server, reageert deze met een foutmelding. Dit is best handig: uit de foutcode kun je afleiden dat het script te snel draait, wacht even en herhaal het verzoek.
    if resultaat == 6: # te veel verzoeken logging.debug("Te veel verzoeken per seconde, slapen..") sleep(1) continue
  • Van tijd tot tijd vereist de vk-server dat u een captcha oplost, waarbij u vermoedt dat de client een bot is. Over het algemeen vermoedt hij correct. Om ervoor te zorgen dat het opslagproces niet wordt onderbroken, moet u de gebruiker vragen de link naar de afbeelding te volgen, de captcha op te lossen en het antwoord in te voeren. Dit wordt in een functie geplaatst met de eenvoudige naam captcha():
    afdrukken("Zij wil jou CAPTCHA oplossen. Open deze URL en typ hier een captcha-oplossing:") print("\n\t()\n.format(data)) oplossing = raw_input("Oplossing = ").strip() return data, oplossing
  • Verwijzingen, aanvullende informatie We schrijven het aantal likes en serverreacties in JSON naar bestanden, voor het geval dat.
  • Bij sommige audio-opnamen zijn songteksten bijgevoegd, wat ook zinvol is om op te slaan.
  • Bestandsnamen zijn mogelijk niet correct voor bestandssysteem, dus we moeten een aantal karakters verwijderen. Ik kon geen kant-en-klare “juiste” oplossing vinden, dus moest ik een minifiets uitvinden:
    resultaat = unicode(re.sub("[^+=\-()$!#%&,.\w\s]", "_", naam, flags=re.UNICODE).strip())
  • Een ander probleem met bestandsnamen: ze kunnen hetzelfde zijn, bijvoorbeeld in het geval van documenten. Om dit te doen, voegt u (n) toe aan de bestandsnaam, waarbij n het eerste getal is dat wordt gegeven unieke naam bestand.
    #bestand kan bestaan, dus voeg (1) of (2) etc counter = 1 toe als het bestaat(fnaam) en isfile(fnaam): naam, ext = splitext(fnaam) fnaam = naam + " (())".format( counter) + ext while exist(fname) en isfile(fname): counter += 1 naam, ext = splitext(fname) fname = naam[:-4] + " (())".format(counter) + ext
Laten we doorgaan
De code voor toegang tot de API is afkomstig uit het habrauser-artikel dzhioev en de verwerking van de hierboven beschreven situaties is toegevoegd. Om iets te besparen (in het geval van muurbehandeling), moet je eerst het aantal berichten achterhalen:
#determine posts count (response, json_stuff) = call_api("wall.get", [("owner_id", args.id), ("count", 1), ("offset", 0)], args) count = antwoord
Vervolgens vragen we elk bericht afzonderlijk op en parseren we het
for x in xrange(args.wall_start, args.wall_end): (post, json_stuff) = call_api("wall.get", [("eigenaar_id", args.id), ("count", 1), ("offset ", x)], args) process_post(("muurpost", x), post, post_parser, json_stuff)
Het resultaat van het verzoek is een set gegevens in JSON, die wordt geparseerd in standaard Python-structuren met behulp van json.loads() van standaard bibliotheek. Als resultaat hebben we een hash-array waarin sommige velden (sleutelwaarde) een lading bevatten, en de rest is niet van belang voor ons. Om niet handmatig te schrijven welk veld we met welke methode moeten verwerken, zullen we de kracht van reflectie gebruiken: we zullen op zoek gaan naar een methode waarvan de naam overeenkomt met de sleutel van belang.
for k in raw_data.keys(): probeer: f = getattr(self, k) sleutels.append(k) funcs.append(f) behalve AttributeError: logging.warning("Niet geïmplementeerd: ()".format(k) ) logging.info("Opslaan: () voor ()".format(", ".join(keys), raw_data["id"])) voor (f, k) in zip(funcs, sleutels): f( k, onbewerkte_data)
Parsim
Nu moeten we de antwoordvelden begrijpen. Interessante zijn bijlagen, tekst, opmerkingen. Bijlagen is een lijst met bijlagen bij een bericht (audio, afbeeldingen, documenten, notities). Je moet elk type kunnen downloaden. Wij bepalen op een vergelijkbare manier welke methode we elke bijlage verwerken: op basis van het type bijlage zoeken we naar een methode met een passende naam. Hier is een voorbeeld van een “schommelstoel” voor audio:
def dl_audio(self, data): aid = data["aid"] eigenaar = data["eigenaar_id"] request = "()_()".format(eigenaar, hulp) (audio_data, json_stuff) = call_api("audio .getById", [("audios", verzoek), ], self.args) try: data = audio_data naam = u"(artiest) - (titel).mp3".format(**data) self.save_url(data ["url"], naam) behalve IndexError: # verwijderd:(logging.warning("Verwijderde track: ()".format(str(data))) return # winkelteksten, indien aanwezig, probeer: lid = data["lyrics_id" ] behalve KeyError: return (lyrics_data, json_stuff) = call_api("audio.getLyrics", [("lyrics_id", lid), ], self.args) text = lyrics_data["text"].encode("utf-8" ) ...
Helaas zijn op verzoek van auteursrechthebbenden in beslag genomen audio-opnamen niet meer beschikbaar en volgt er een leeg antwoord.

Hoe zit het met de rest?

Methoden voor het verwerken van afbeeldingen, tekst, notities, het uploaden van documenten en de rest staan ​​in github. Ik zal alleen zeggen dat alles vergelijkbaar is met de gegeven voorbeelden. Het script bevat ook argumenten opdrachtregel, het heeft geen zin om ze in het artikel te beschrijven. Voorbeelden en andere details staan ​​in het leesmij-bestand.
TODO
Ik heb geen fotoalbums opgeslagen omdat ik daar niets belangrijks opsla, en de kilonetcode uit zijn artikel werkt goed. Video-opnames en aantekeningen zijn nog niet opgeslagen; dit leek mij niet zo nodig.
Ten slotte
De code is verre van ideaal en onderscheidt zich niet door de afwezigheid van krukken, maar volbrengt zijn taak. Ik hoop dat iemand mijn vak nuttig zal vinden voor het opslaan van aantekeningen/documenten/muziek, of om te leren.
UPDATE 18/12/2016
Gebruiker hiwent zegt dat VK sinds 16 december 2016 de mogelijkheid heeft gesloten om de API te gebruiken voor het werken met audio-opnames. In dit opzicht werkt de scriptfunctionaliteit voor het opslaan van audio-opnamen niet. In dit opzicht kunt u proberen te "doen alsof" de native VK-applicatie is, bijvoorbeeld de Android-versie, of Kate mobiel. Voor hen zal de mogelijkheid om met audio-opnames te werken nergens verdwijnen, al kunnen de methoden verschillen.

De progressieve mensheid is zich terdege bewust van wat sociale netwerken zijn. Bij regelmatig gebruik site “in contact” voor communicatie en het tot stand brengen van zakelijke verbindingen, vroeg of laat ontstaat de noodzaak om de muur schoon te maken. De muur die “in contact” is, heeft de neiging afval in de vorm op te hopen onnodige berichten, willekeurige vermeldingen, spam. Voor optimalisatie sociaal netwerk speciaal contactreinigingsprogramma's waarmee u de muur snel kunt reinigen.

De eerste reinigingsmethode is het script (extensie) VkOpt 2.x

Om snel een muur schoon te maken, moet je een extensie installeren om de browser te laten werken. Volg de link http://vkopt.net/download/ - voor chrome ( voor andere browsers, zie de website van de ontwikkelaar).

Nadat u het VkOpt 2.x-script hebt geïnstalleerd, moet u de browser opnieuw opstarten om de extensie te laten functioneren. Dan moet je naar vk.com gaan, naar startpagina. Er verschijnt een tabblad “acties” op de muur, met de volgende opdrachten eronder:

  • links naar foto's ophalen
  • het schoonmaken van de muur

We moeten de pagina opruimen, dus kiezen we de tweede. Nadat de actie is voltooid, verschijnt er een venster waarin u wordt gevraagd om te verwijderen onnodige informatie van één of beide pagina's. Als je de ene pagina volledig optimaliseert, blijft alle informatie op de andere pagina staan. Je kunt ook de hele muur volledig schoonmaken.

De tweede reinigingsmethode is het vkbot-programma

Een universele tool helpt u uw website in VKontakte te optimaliseren. vkbot-programma. Dankzij de geavanceerde functionaliteit kunt u de muur met één klik schoonmaken. Om dit te doen, moet je het programma hier downloaden http://vkbot.ru/. Na softwareproduct wordt geïnstalleerd, moet u inloggen. Dan moet je het volgende doen:

  • selecteer profielsectie
  • druk op de schoonknop (verwijderen)
  • selecteer het commando “schone muur”.

Hierna zal het programma u vragen uw acties te bevestigen. U moet op OK klikken. Vervolgens kunt u het proces van het schoonmaken van de muur bekijken. Aan het einde van het proces meldt het programma de gebruiker dat het proces voor het reinigen van de muren is voltooid.

Programma voor automatische promotie gemeenschappen door inzendingen (posts) van de ene VKontakte-gemeenschap naar de andere te verzamelen. Dit programma biedt enorme hoeveelheid verschillende instellingen en opties, waarmee u het programma aan uw wensen kunt aanpassen.

Grabber van de gehele VKontakte-muur:
Met de VKontakte-wallgrabber kunt u het kopiëren van vermeldingen (berichten) van de ene VKontakte-gemeenschap naar de andere configureren, rekening houdend met verschillende opties en criteria.
Online grabber VKontakte
De VKontakte online grabber is ontworpen om nieuwe berichten van de muur van een andere VKontakte-gemeenschap te kopiëren en gaat ervan uit dat er een hele lijst met brongemeenschappen bestaat.

Hier volledige lijst opties en instellingen die kunnen worden opgegeven en geïnstalleerd wanneer u de grabber voor uzelf aanpast:

Adverteren op VKontakte
Dit is een PR-methode voor de VKontakte-gemeenschap, die gebaseerd is op publicatie nieuwe invoer naar een andere gespecificeerde community met specifieke informatie, bijvoorbeeld met een link naar uw community. Tegelijkertijd wordt het aanmaken van een bericht in de ontvangende groep herhaaldelijk uitgevoerd, waarbij alleen wordt verdeeld opgegeven interval tijd. Na het publiceren van een nieuw bericht wordt het vorige verwijderd.
  • Alleen posten in bepaalde tijd met de mogelijkheid om de start- en eindtijd op te geven (de tijd wordt ingesteld in uren en minuten)
  • ; zowel eigen als buitenlandse gemeenschappen zijn toegestaan
  • Het specificeren van het update-interval, dat wil zeggen het interval tussen het opnieuw verzenden van een bericht;
  • Mogelijkheid om een ​​op een computer geselecteerde foto aan een gepubliceerd bericht toe te voegen
  • Bij het aanmaken van nieuwe berichten kunt u het volgende opgeven: het aantal minuten waarna het plaatsen moet zijn voltooid en of het bericht na voltooiing moet worden verwijderd; evenals het aantal minuten waarin u geen berichten hoeft te publiceren in de geselecteerde community
Advertentierepost VKontakte
Dit is een PR-methode voor de VKontakte-gemeenschap, die is gebaseerd op het opnieuw posten van het opgegeven item in de opgegeven gemeenschap. Tegelijkertijd wordt het opnieuw posten naar de ontvangersgroep meerdere keren uitgevoerd, slechts gescheiden door een gespecificeerd tijdsinterval. Voordat de volgende repost wordt uitgevoerd, wordt de vorige verwijderd.


Hier vindt u een volledige lijst met opties en instellingen die u kunt opgeven en instellen wanneer u voor uzelf een adverteerder instelt:
  • Een link opgeven naar de doelgemeenschap
  • Het specificeren van het update-interval, dat wil zeggen het interval tussen het opnieuw verzenden van een bericht
  • Mogelijkheid om te kiezen tussen het maken van een nieuw bericht in de ontvangende groep of het bijwerken van een eerder gemaakt bericht
  • bij het aanmaken van nieuwe berichten kunt u opgeven: het aantal minuten waarna het plaatsen moet zijn voltooid, en of het bericht na voltooiing moet worden verwijderd; evenals het aantal minuten waarin u geen berichten hoeft te publiceren in de geselecteerde community
  • Geeft een link naar het bericht aan, dat opnieuw in de community wordt geplaatst
  • Het specificeren van de tekst van het bericht dat bij het bericht is gevoegd; Hier kunt u zowel gewone tekst als diverse links invoeren
Grabber op pc
Dit is een functie waarmee u het vereiste aantal berichten van een bepaalde VKontakte-gemeenschap op uw computer kunt opslaan. Alle berichten worden als bestand in de geselecteerde map opgeslagen xml-formaat. Erg nuttige functie, als het uw doel is om het nodige te verzamelen en te organiseren informatiebasis voor latere berichten in uw gemeenschap.

Hier vindt u een volledige lijst met opties en instellingen die u kunt opgeven en instellen wanneer u voor uzelf een adverteerder instelt:

  • Alleen op een bepaald tijdstip grijpen met de mogelijkheid om de start- en eindtijd op te geven (tijd wordt ingesteld in uren en minuten)
  • Een link naar de broncommunity opgeven
  • Een map op uw computer selecteren waarin u berichten wilt beroven
  • Met vermelding van het nummer van de paal waar het grijpen moet beginnen en het nummer van de paal waar het grijpen moet worden voltooid
  • De mogelijkheid om willekeurig te grijpen, dat wil zeggen, niet in overeenstemming met de volgorde van postnummers
  • Specificeer het interval tussen het opslaan van berichten in minuten
  • Voorwaarden voor het selecteren van berichten: selecteer alleen berichten met minimale hoeveelheid likes, reposts en reacties
Grijpen met preview
Dit is een functie waarmee u berichten van een VKontakte-gemeenschap naar uw intermediaire gemeenschap kunt overbrengen. Erg handig als je berichten handmatig vooraf moet modereren. Nadat u onnodige berichten hebt bewerkt en verwijderd, kunt u beginnen met het gebruikelijke verzamelen van berichten van de tussenliggende community naar uw bestemmingscommunity.

Hier vindt u een volledige lijst met opties en instellingen die u kunt opgeven en instellen wanneer u voor uzelf een adverteerder instelt:

Lijst met repostadvertenties
Dit is een PR-methode voor de VKontakte-gemeenschap, vergelijkbaar met de “Repost Advertising”-methode, maar dan voor het werken met een lijst met berichten. Laten we u eraan herinneren dat deze methode is gebaseerd op het opnieuw plaatsen van de opgegeven berichten in de opgegeven community. Tegelijkertijd worden er meerdere keren opnieuw berichten naar de ontvangersgroep geplaatst, alleen gescheiden door een bepaald tijdsinterval. Voordat de volgende repost wordt uitgevoerd, wordt de vorige verwijderd. Gekenmerkt door de volgende opties:
  • Alleen op een bepaald tijdstip opnieuw posten met de mogelijkheid om de start- en eindtijd op te geven (de tijd wordt ingesteld in uren en minuten)
  • Een link opgeven naar de doelgemeenschap
  • Het specificeren van het update-interval, dat wil zeggen het interval tussen herposts
  • Geeft links aan naar berichten die opnieuw worden geplaatst
  • Het specificeren van de tekst van het bericht dat bij het bericht is gevoegd; Hier kunt u zowel gewone tekst als diverse links invoeren
Grabber van recente berichten uit de zoekresultaten
Promotiemethode gebaseerd op kopiëren uit de zoekopdracht trefwoorden laatste berichten binnen eigen gemeenschap VKontakte voor een bepaald tijdsinterval. Om de methode te configureren, zijn er een aantal volgende functies:
Extra functies over het werken met een grijper
Voor promotiemethoden zoals " Hele muurgrijper», « Online grijper», « Grijpen met preview" En " Grabber van recente berichten uit de zoekresultaten" mits een hele serie extra opties, waarmee je berichten gedetailleerder kunt aanpassen en ongepaste inhoud kunt filteren.


Deze opties omvatten:
  • Tekst toevoegen aan gekopieerde berichten: aan het begin van het bericht, aan het einde van het bericht
  • Woorden specificeren die moeten worden vervangen in de notatie before::after
  • Stopwoorden opgeven om onnodige berichten over te slaan
  • Geeft aan of hashtags uit gekopieerde berichten wel of niet moeten worden beroofd
  • De mogelijkheid om gekopieerde berichten te ondertekenen met hyperlinks naar de brongroep of de auteur die het bericht aan de brongroep heeft voorgesteld; plus de mogelijkheid om uw eigen tekst aan deze handtekening toe te voegen
  • Indicatie van wie er moet worden beroofd: de hele muur, berichten alleen namens de community, berichten alleen niet namens de community
  • Indicatie of reposts moeten worden beroofd of niet
  • Indicatie of berichten met video's moeten worden beroofd: ja, nee, video's uit berichten knippen
  • Indicatie of berichten met audio moeten worden beroofd: beroven, alle audio afsnijden, berichten niet beroven met audio, berichten zonder audio niet beroven
  • Indicatie of berichten met afbeeldingen moeten worden beroofd: beroven, alle foto's uitknippen, berichten met foto's niet beroven, berichten zonder foto's niet beroven
  • Indicatie of berichten met tekst moeten worden beroofd: beroven, tekst knippen, berichten met tekst niet beroven, berichten zonder tekst niet beroven
  • Geef aan of berichten met links wel of niet moeten worden beroofd, en als er wordt beroofd, of de links uit gekopieerde berichten moeten worden verwijderd
  • Een bericht publiceren door opnieuw te posten
  • Aangeven of opiniepeilingen moeten worden beroofd; de enquête zelf wordt niet gekopieerd
  • Vermelding van de handtekening van de auteur of beheerder vanaf wiens account wordt gegrepen
  • Vermelding of u een watermerk wilt gebruiken: ja/nee; zo ja, dan kunt u de locatie kiezen (linksboven, linksonder, rechtsboven, rechtsonder); De watermerkafbeelding moet op uw computer zijn geselecteerd
Enkele voordelen en kenmerken van het VKDog-programma:
  • Grabber van inzendingen (posts) van community naar community op VKontakte
  • Online grabber van nieuwe vermeldingen (berichten) uit de lijst met communities naar de VKontakte-gemeenschap
  • VKontakte-advertenties - het gewenste bericht (post) herhaaldelijk na een bepaalde periode in de VKontakte-gemeenschap plaatsen
  • Adverteren door opnieuw te posten op VKontakte - het gewenste bericht (post) herhaaldelijk opnieuw posten in de VKontakte-gemeenschap na een bepaalde periode
  • Grabber op een computer - inzendingen (berichten) van de VKontakte-gemeenschap opslaan op een computer in een XML-bestand
  • Grabber met preview - het kopiëren van inzendingen (posts) van de VKontakte-gemeenschap naar een tussenliggende gemeenschap voor handmatige pre-moderatie
  • Advertentie-repostlijst - repostlijst de benodigde administratie(posts) herhaaldelijk na een bepaalde periode naar de VKontakte-gemeenschap
  • Verzamel nieuwe berichten uit de zoekresultaten - alleen kopiëren naar uw community laatste inzendingen(berichten) van VKontakte zoeken op trefwoorden
  • Alle opgegeven VKontakte-accounts controleren op geldigheid
  • Ondersteuning voor captcha-herkenningsdiensten Antigate.com en RuCaptcha.com
  • Mogelijkheid om gemaakte taken te beheren: alles inschakelen of alles uitschakelen
  • Analyse van lijsten met stopwoorden en vervangende woorden voor analyse en verwerking van inzendingen (posts) tijdens publicatie
  • Mogelijkheid om namen voor taken in te stellen voor het grootste gemak bij het werken met grote hoeveelheden
  • Mogelijkheid tot geforceerd opslaan van alle instellingen en gegevens die in het programma zijn ingevoerd
  • Het bijhouden van een logboek van programmagebeurtenissen
  • Gebruiksgemak
De hierboven beschreven functionaliteit beschrijft alle mogelijkheden van VKDog-programmaversie 4.0.9. Als u een functie kende die niet op onze lijst staat, is deze hoogstwaarschijnlijk verwijderd in versie 4.0.9.

Invoering

Goedemiddag, Ik heb lange tijd niets geschreven - er waren veel redenen. Gedurende deze tijd, genoeg groot aantal materiaal en ik zal proberen het hier zo volledig mogelijk weer te geven. Vandaag wil ik het hebben over het werken met de contact-API via Python, en een voorbeeld hiervan is het downloaden van een tijdschriftenmuur Jevgeni Onegin. Hoofdstuk 11. Als je te lui bent om te lezen hoe ik dit allemaal heb gedaan en je wall snel wilt downloaden, ga dan direct naar de sectie 'Rapporteren en testen'.

Voorbereiding

Het eerste dat u hoeft te doen is de API downloaden en de applicatie registreren, waarbij u de ID ervan ontvangt (als u uw applicatie niet wilt registreren en de ID ervan wilt ontvangen, slaat u deze stap gewoon over - standaard vervangt het programma mijn applicatie-ID) . De API is beschikbaar op dit adres https://pypi.python.org/pypi/vkontakte. Daar vindt u installatie-instructies. Als het niet werkt, download dan de bestanden, pak het uit en voer het uit in de terminal (Linux)

$ sudo python2 ./setup.py install $ python2 Python 2.7.5 (standaard, 12 mei 2013, 12:00:47 PM) op linux2 Typ "help", "copyright", "credits" of "license" voor meer informatie . >>> VKontakte importeren
Na de installatie kunnen we de functionaliteit van deze bibliotheek gebruiken, maar sinds enige tijd is het verplicht geworden om een ​​browservenster te maken zodat de gebruiker zijn login en wachtwoord invoert, en pas dan ontvangen we een token_id voor het werken met de Python API. Om niet in deze jungle terecht te komen, kunt u zich voordoen als een browservenster, daar fictief een geldige login en wachtwoord invoeren en uw legale token ontvangen. Dit artikel beschrijft dit in meer detail. kleine hack. Als resultaat van het artikel is een autorisatieklasse gemaakt, die de login, het wachtwoord, de applicatie-ID en de gevraagde rechten rapporteert. Ik heb dit bestand een beetje bewerkt omdat het niet werkte. Je kunt mijn versie downloaden.

Eerste stappen

Laten we het voor het eerste voorbeeld doen eenvoudige machtiging met enig verzoek.

#!/usr/bin/env python3 # -*- codering: utf-8 -*- import vk_auth import vkontakte def main(): (token,user_id) = vk_auth.auth("$EMAIL", "$PASSWD", "$ID_APP", "$SOPE") vk = vkontakte.API(token=token) print "Hallo vk API, servertijd is ",vk.getServerTime() return 0 if __name__ == "__main__": main()
Niets ingewikkelds: we importeren de autorisatieklasse, importeren de bibliotheek met de API, krijgen een token en identificatie en gebruiken API-functies.

Voorbeeld

Nu is het tijd voor een groot, serieus en vooral praktisch voorbeeld: het downloaden van een VKontakte-muur. Het idee om de muur te downloaden ontstond uit dringende behoefte. Openbare VKontakte is heel handig georganiseerd, met één uitzondering: oude informatie onmogelijk te vinden aan de muur. Een idee was geboren: download de hele muur van het publiek en splits deze op in verschillende HTML-bestanden betere snelheid toegang.
Voordat u met het werk begint, moet u een competente technische taak instellen.

Referentievoorwaarden

Een script of een reeks scripts voor het downloaden van een muur van het sociale netwerk VKontakte.
Invoergegevens:
  • Gebruikersnaam
  • Wachtwoord
  • Groep\openbaar\pagina-ID
  • Aantal berichten om te downloaden
  • Vanaf welk bericht u wilt downloaden
  • In hoeveel HTML-blokken moet je opsplitsen?
De applicatie moet alle tekst en grafische informatie van de muur voor gemakkelijk offline bekijken. Als er video's of links aan de muur hangen, moet de applicatie hun naam vermelden en een link naar internet aanbieden. De applicatie moet ook alle reacties op berichten downloaden en deze op de juiste manier opmaken (vergelijkbaar met berichten).

Uitvoering

Laten we beslissen over het programmakader en de binnenkomende parameters.
Laten we deze code voor nu schetsen. Ik heb de OptionParser-bibliotheek gebruikt om parameters te parseren - deze komt uit de doos en is erg handig. De volgende stap is het organiseren van de uitsplitsing in volumes. Heb het een beetje veranderd oude code, krijgen we een algoritme dat de informatie opsplitst in het vereiste aantal volumes. Hier is de code. Vervolgens moet je de vk API gebruiken en berichten downloaden van Contact. Na gerookt te hebben documentatie, vond ik snel vereiste functie. Met de contact-API kunt u JSON-verzoeken verzenden en JSON-antwoorden ontvangen. De vkAPI die we gebruiken, kapselt JSON-verzoeken in een lijst met variabelen in. Ik kan niet zeggen dat dit erg handig is, maar ik heb geen andere manier gevonden. Om berichten van de muur van een specifieke groep op te vragen, moeten we de volgende code uitvoeren

Posts = vk.get("wall.get", eigenaar_id=eigenaar_id,offset=offset,count=count)
Na het uitvoeren van deze code in berichten zal zich aanmelden graaf palen met offset gecompenseerd. Het is vermeldenswaard dat er een limiet is op het aantal gedownloade berichten en, als ik me niet vergis, is dit gelijk aan 100. Ik heb de waarde 50 genomen als het optimale aantal gedownloade berichten in 1 iteratie van de cyclus. In de vorige lijst heb ik 2 functies gemarkeerd: berichten downloaden get_posts() en opmaak in HTML posts_to_html() en plaats er pluggen op. Nu ben ik aan het vullen get_posts() de hierboven gegeven code. IN referentievoorwaarden Ik moest ook alle opmerkingen bij de code downloaden. Ik heb de functie van het downloaden van berichten gescheiden en deze in HTML geformatteerd, wat betekent dat het downloaden van reacties samen met het downloaden van berichten moet gebeuren en in één variabele moet worden vastgelegd. Gelukkig is JSON een dynamisch formaat en is het eenvoudig aan te vullen met één veld waarin commentaar wordt opgeslagen.
In de documentatie vinden we commentaar downloadfunctie en implementeren. We zullen de functie van het downloaden van een bericht met opmerkingen verdelen in 2 functies: het downloaden van een bericht en het downloaden van opmerkingen ernaar. We krijgen deze code:

Def get_comments(vk,owner_id,post_id,count): size = 50 reacties = if(count 0): post_id = posts[i]["id"] comments = get_comments(vk,owner_id,post_id,comments_count) posts[i]["comments"]["data"]=comments print len(comments),comments_count return berichten
Nu de functie get_posts zal berichten retourneren waarin in het veld opmerkingen.data opmerkingen daarop worden opgeslagen.
Op dit punt is het werk met het downloaden van de gegevens voltooid. Het is ook nodig om van al deze rompslomp prachtige HTML-pagina's te maken. Ik zal eerlijk zijn: voor mij is dit het meest helse werk. Maar er zijn geen andere manieren - vooruit.

Vorming van HTML-pagina's.

Om het te maken, heb ik een hele reeks sjablonen geschreven waarin ik vervolgens gegevens uit JSON zal invoegen. Ik zal ze hier niet allemaal opsommen. Ik geef je gewoon een link naar het voltooide project. De functie voor het genereren van HTML bleek enorm en lelijk. Als er mensen zijn die professionals zijn in HTML, zal ik hen dankbaar zijn voor een gunstiger ontwerp, dat meer op Vk lijkt.

Gegevens downloaden.

Een van de punten van de technische specificaties was gemakkelijk lokaal bekijken. Op dit moment zijn alle links naar afbeeldingen en audio-opnamen absoluut (dat wil zeggen, ze leiden naar internet), maar ze moeten in de buurt zijn, zodat je bij afwezigheid van internet de foto kunt bekijken en naar de muziek kunt luisteren. Je kunt dit doen met Python via de griezelige Karaganda. Maar ik gaf de voorkeur aan de elegantere optie: wget. Dit is een standaard Linux-internetdownloader en kan een webpagina met informatie erover downloaden. Om HTML te voeden, moet je ook man wget lezen en verschillende noodzakelijke sleutels vinden.
Het resultaat is dit script:

$wget -B -k -r -l0 --force-html -i naam-*.html -P ./data

Er is maar één MAAR: wget downloadt alle informatie, maar converteert de links niet. Misschien kan het dit natuurlijk doen, maar ik heb niet gevonden hoe. Daarom zullen we in Python een transformatie schrijven van elk contactfoto-/audio-opslagadres naar een link naar de aangrenzende map (GroupName)_(VolumeNumber)data. Ik heb bewust de groepsnaam en het volumenummer gescheiden, zodat je maar één volume mee kunt verplaatsen en niet een onnoemelijke hoeveelheid informatie meesleept die niet wordt gebruikt.

Def convert_lincs(txt,folder,recurce = 0): out = re.sub("http://",folder,txt) return out
Zoals je kunt zien, hebben we dit probleem dankzij de kracht van reguliere expressies in één regel opgelost.
Ook kwam ik het probleem tegen van voortdurend onderbroken verbindingen (ik heb slecht internet) en weigering van Contact vanwege de hoge frequentie van verzoeken. Deze twee factoren lieten het programma regelmatig crashen, dus heb ik fouttolerante wrappers gemaakt voor alle methoden om toegang te krijgen tot internet die ik gebruikte. Het bleek zo:

Def wall_getComments(vk,owner_id,post_id,count,recurce = 0): if (recurce ==20): return try: com = vk.get("wall.getComments", eigenaar_id=eigenaar_id,post_id=post_id,count=count ) behalve: time.sleep(1) print "Fout wall_getComments try ",recurce com = wall_getComments(vk,owner_id,post_id,count,recurce = recurce+1) return com def wall_get(vk,owner_id,offset,count,recurce = 0): if (recurce ==20): return try: res = vk.get("wall.get", eigenaar_id=eigenaar_id,offset=offset,count=count) behalve: time.sleep(1) print "Fout wall_get try ",recurce res = wall_get(vk,owner_id,offset,count,recurce = recurce +1) return res def users_get(vk,uids,fields,recurce = 0): if (recurce ==20): return try: res = vk.get("users.get",uids=uids,fields="photo") behalve: time.sleep(1) print "Fout user_get try ",recurce res = users_get(vk,uids,fields,recurce = recurce +1) return res def groups_getById(vk,group_ids,recurce = 0): if (recurce ==20): return try: res = vk.get("groups.getById", group_ids=group_ids) behalve: time.sleep( 1) print "Fout groups_getById try ",recurce res = groups_getById(vk,group_ids,recurce = recurce +1) return res
Als het netwerk uitvalt of er een fout optreedt bij het ontvangen van gegevens, wacht ik een halve seconde en probeer het opnieuw.

Rapporteren en testen

Het resultaat van mijn werk publiceer ik op Github. U kunt dus deelnemen aan het project, mijn werk overnemen, uw eigen werk toevoegen, het aanpassen aan uw behoeften en eenvoudigweg het project ontwikkelen.
En nu eindelijk testen. Houd er rekening mee dat ik Python2.X ga gebruiken en wees niet ontmoedigd als je zoiets als dit ziet wanneer je het programma probeert uit te voeren:

$ python ./WallCopy.py Bestand "./WallCopy.py", regel 40 print "%s Failure"%"wall_getComments" ^ SyntaxError: ongeldige syntaxis
De programmaproblemen helpen in het Engels als u het uitvoert met de schakeloptie -h. Voor de luien vertaal ik het in het Russisch:

  • -e E-MAIL, --e-mail=E-MAIL E-mail voor autorisatie
  • -p PASSWD, --passwd=PASSWD Het wachtwoord voor autorisatie. Als u dit niet expliciet heeft ingesteld, zal het programma u tijdens de uitvoering vragen dit in te voeren. Uiteraard is het wachtwoord onzichtbaar.
  • -i GID, --groupid=GID ID van de groep waarvan de wall moet worden gedownload
  • -c AANTAL, --telling=AANTAL- het aantal berichten dat moet worden gedownload. Indien niet gespecificeerd, worden alle berichten van de muur gedownload.
  • -f OFFSET, --offset=OFFSET- offset vanaf waar het downloaden moet beginnen; niet gespecificeerd, dan 0.
  • -s SPLIT_NUM, --split=SPLIT_NUM- het aantal blokken waarin gedownloade berichten zijn verdeeld, indien niet gespecificeerd, dan 1
  • -een APP_ID, --app_id=APP_ID- de identificatie van de aanvraag die u heeft ontvangen bij registratie (indien niet gespecificeerd, wordt mijn aanvraag-ID gebruikt)
  • -d DOWNLOAD, --download_all=DOWNLOAD- een sleutel die bepaalt of media gedownload moeten worden. Mogelijke waarden:
    • 0 - Niet laden (standaard)
    • 1 - laden nadat de hoofdinformatie is geladen
Typisch gebruiksvoorbeeld:

python2 ./WallCopy.py -e EMAIL -i GROUP_ID

Hierdoor worden alle berichten van de muur geladen met een nulafwijking, maar de links blijven absoluut. Het programma zal interactief om het wachtwoord vragen en de overige opties zullen hun standaardwaarden aannemen.

Geavanceerd gebruiksvoorbeeld:

python2 ./WallCopy.py -eE-MAIL-p WACHTWOORD -i GROEP_ID -c 1000 -f 500 -s 8 -a APP_ID-d 1

In dit geval worden 1000 berichten geladen met een offset van 500 en opgesplitst in 8 volumes, en worden afbeeldingen met muziek naar de computer gedownload.

In dit stadium zijn er veel dingen die het programma niet ondersteunt, maar wel graag zou willen:

  1. Upload alleen foto's en negeer muziek;
  2. Meer vergelijkbaar ontwerp als Vk;
  3. Voorbeeldvideo;
  4. Linux-vereiste (wget)
  5. Alleen Python 2.X ondersteund
  6. OOP gebruiken
Dat is waarschijnlijk alles. Ik zal erg blij zijn om feedback en getalenteerde HTML-codeurs te ontvangen voor een beter ontwerp.

Met zijn hulp kun je de map op je harde schijf vullen met uitstekende berichten voor VKontakte, gedownload van de muur van elke groep.

Als u het programma Vkdog nog niet heeft gebruikt, raad ik u aan het te downloaden en op uw pc te installeren, u te registreren en in te loggen met uw gebruikersnaam.

Laten we een programma voorbereiden voor gebruik, of beter gezegd, een VKontakte-account toevoegen, succesvol inloggen en de anti-captcha-sleutel invoegen. Hoe je dit doet, is eerder in dit artikel geschreven.

Een taak toevoegen om een ​​VKontakte-muur te pakken en deze op uw computer op te slaan

Klik op de knop " + Taak toevoegen».

We voeren achtereenvolgens drie stappen uit:

  1. Laten we een naam voor deze taak bedenken en opschrijven, bijvoorbeeld 'multicooker voor een computer'. Het is een beetje vreemd, maar ik begrijp dat de groep over multicookers gaat en dat het de taak is om berichten op een computer te parseren. Het belangrijkste is om zo te schrijven dat het voor u duidelijk is: de naam heeft nergens invloed op.
  2. Selecteer het taaktype “Grabber op computer” in de tabbladen.
  3. Uit de lijst met accounts moet u degene aangeven die deze actie zal uitvoeren.

Klik op “Doorgaan”.

Er verschijnt een venster met de titel “ Opslaan op computer».

Wij vullen twee velden in:

Waar te beroven. In de zoekbalk voor communities op het sociale netwerk Vkontatka voeren we de trefwoorden in waarmee we naar een groep zoeken om te grijpen. We zullen de benodigde selecteren uit de zoekresultaten; ik raad aan om deze handmatig te openen en te controleren op de beschikbaarheid van berichten van hoge kwaliteit om te downloaden. We vinden degene die we nodig hebben en kopiëren de link ernaar in de adresbalk van de browser. We plaatsen het in de lijn (van waar te beroven).

Welke map je moet beroven. Klik op "Bladeren" - geef het pad aan naar de map waarin we berichten zullen opslaan. Als er geen bestaat, moet deze worden gemaakt. Oké, laten we doorgaan.

Grijpen instellen op een computer - viraliteit van berichten

In het nieuwe venster valt de bovenste regel meteen op, waarin het aantal berichten voor het publiek wordt weergegeven. De mijne is 1571.

Ik vink het vakje aan voor het willekeurig kopiëren van berichten uit de groep. Omdat de volgorde er niet toe doet, download ik ze allemaal. Ik heb het interval tussen berichten ingesteld op "1". Dit zal het grijpproces versnellen.

  • Minimale likes – 20
  • Minimale herposts – 5
  • Minimum aantal opmerkingen – 0 (dit is niet belangrijk).
Laat me u eraan herinneren dat u deze waarden moet instellen op basis van uw taken. Hoe hoger de eisen worden gesteld, hoe minder berichten het programma zal beroven, maar de kwaliteit ervan zal hoog zijn. Dat wil zeggen, ze zijn in trek bij de doelgroep!

KLAAR! – er is een taak toegevoegd voor het overnemen van berichten van VKontakte naar een computer.

De activiteitengeschiedenis laat zien hoe het programma berichten van de opgegeven groep naar een map op de harde schijf berooft.

Ze worden opgeslagen in een bestand met de extensie .XML.

Conclusies

Dit type opdracht is geschikt voor degenen die berichten in XML-formaat nodig hebben. Nadat Vkdog ze volgens bepaalde parameters uit de groep heeft gedownload, slaat ze ze op in één bestand.

VKdog is een zeer nuttig programma dat vol zit met zeer nuttige functies voor het hoogwaardig vullen van VKontakte-gemeenschappen. De ontwikkelaars proberen te voldoen aan de moderne behoeften van beheerders en SMM-specialisten op het sociale netwerk VKontakte.

Daarom, als u van plan bent geld te verdienen door VKontakte-groepen te runnen, dan kunt u eenvoudigweg niet zonder deze assistent! . Geniet van het werk van goede software!