diff --git a/.gitignore b/.gitignore index 90703d2..1f89d9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ .config -Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..4d0dfd3 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,43 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + faraday (0.17.3) + multipart-post (>= 1.2, < 3) + faraday-cookie_jar (0.0.6) + faraday (>= 0.7.4) + http-cookie (~> 1.0.0) + faraday_middleware (0.14.0) + faraday (>= 0.7.4, < 1.0) + http-cookie (1.0.3) + domain_name (~> 0.5) + httparty (0.18.1) + mime-types (~> 3.0) + multi_xml (>= 0.5.2) + mediawiki_api (0.7.1) + faraday (~> 0.9, >= 0.9.0) + faraday-cookie_jar (~> 0.0, >= 0.0.6) + faraday_middleware (~> 0.10, >= 0.10.0) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2020.0512) + multi_xml (0.6.0) + multipart-post (2.1.1) + public_suffix (4.0.5) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + +PLATFORMS + ruby + +DEPENDENCIES + addressable + httparty + mediawiki_api + +BUNDLED WITH + 2.0.2 diff --git a/README.md b/README.md index 8256ff1..40ee3ee 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,34 @@ # Catimporter Importa una categoria (con relative sottocategorie) da una wiki all'altra. ## Prerequisiti Lo script richiede Ruby. -In particolare sono richiesti i moduli (gems) +In particolare sono richieste le gem - `httparty` - `addressable` - `mediawiki_api` -E' possibile installare e gestire le dipendenze usando [bundler](https://bundler.io): +È possibile installare e gestire le dipendenze usando [bundler](https://bundler.io): ```console bundle install (systemwide) bundle install --path vendor/bundle (utente) ``` ## Avvio e configurazione Eseguite lo script chiamato `process.rb` (per esempio, col comando `$ ruby process.rb`); vi verranno richiesti alcuni parametri fondamentali che verranno salvati in un file chiamato .config e ripresi automaticamente alle successive esecuzioni. -### Esempio configurazione - -```ini -utente@nome_bot -password_bot -https://it.wikipedia.org/w/api.php -https://wikitrash.miraheze.org/w/api.php -wikipedia:it -Categoria:Pagine_in_cancellazione_per_argomento -``` - Se state eseguendo il programma avendo installato le dipendenze come utente, e' probabile dobbiate settare anche la variabile `$GEM_HOME` in modo che punti alla cartella di bundler. +Sembrerebbe **NON** essere possibile utilizzare un'utenza bot per l'importazione delle voci. ## Eseguire ciclicamente Potete aggiungere lo script alla crontab, chiedendo `which ruby` ed inserendo in crontab una cosa del genere (sostituendo user col nome del vostro utente, /usr/bin/ruby col risultato di which ruby e directory col path allo script): ``` 0 1 * * * user /usr/bin/ruby /directory/process.rb ``` diff --git a/process.rb b/process.rb index d8dabab..8a862e1 100644 --- a/process.rb +++ b/process.rb @@ -1,126 +1,139 @@ require 'httparty' require 'addressable' require 'mediawiki_api' + # Legge le credenziali e la wiki di destinazione if !File.exist? "#{__dir__}/.config" puts 'Inserisci username:' print '> ' username = gets.chomp puts 'Inserisci password:' print '> ' password = gets.chomp puts 'Inserisci indirizzo API della wiki di provenienza (nella forma https://it.wikipedia.org/w/api.php)' print '> ' fromwiki = gets.chomp puts 'Inserisci indirizzo API della wiki di destinazione (nella forma https://it.wikipedia.org/w/api.php)' print '> ' importwiki = gets.chomp puts "Inserisci il prefisso interwiki della wiki di provenienza sulla wiki di destinazione, avendo cura di verificare che l'importazione sia abilitata per quel prefisso" print '> ' interwikiprefix = gets.chomp puts "Inserisci la categoria che contiene le pagine da importare (l'importazione è ricorsiva)" print '> ' importcat = gets.chomp File.open("#{__dir__}/.config", "w") do |file| file.puts username file.puts password file.puts fromwiki file.puts importwiki file.puts interwikiprefix file.puts importcat end end + userdata = File.open("#{__dir__}/.config", "r").to_a userdata.map! {|d| d.gsub!("\n", "")} fromwiki = userdata[2] importwiki = userdata[3] importcat = userdata[5] # Funzione per ottenere i membri della categoria def getcatmembers(cat, fromwiki) - pagelist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(cat)}&format=json&cmlimit=max", uri_adapter: Addressable::URI).to_a + pagelist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(cat)}&format=json&cmlimit=max", + uri_adapter: Addressable::URI).to_a unless pagelist.empty? if pagelist[2].nil? pagelist = pagelist[1][1]['categorymembers'] else cmcontinue = pagelist[1][1]['cmcontinue'] continue = pagelist[1][1]['continue'] pagelist = pagelist[2][1]['categorymembers'] end unless pagelist.nil? while continue == '-||' puts 'Ottengo la continuazione della categoria...' - new_pagelist = HTTParty.get(fromwiki, query: {action: :query, list: :categorymembers, cmtitle: CGI.escape(cat), cmlimit: 500, cmdir: :newer, cmcontinue: cmcontinue, format: :json }, uri_adapter: Addressable::URI).to_a + new_pagelist = HTTParty.get(fromwiki, + query: {action: :query, + list: :categorymembers, + cmtitle: CGI.escape(cat), + cmlimit: 500, + cmdir: :newer, + cmcontinue: cmcontinue, + format: :json }, + uri_adapter: Addressable::URI).to_a unless new_pagelist.nil? if new_pagelist[2].nil? new_pagelist = new_pagelist[1][1]['categorymembers'] continue = false @noph = true else cmcontinue = new_pagelist[1][1]['cmcontinue'] continue = new_pagelist[1][1]['continue'] new_pagelist = new_pagelist[2][1]['categorymembers'] end unless new_pagelist.nil? puts 'Sommo le liste di foto...' pagelist = pagelist += new_pagelist end end end end return pagelist end end + # recupera la lista delle categorie con pagine da cancellare -catlist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(importcat)}&format=json&cmlimit=max", uri_adapter: Addressable::URI).to_a[2][1]['categorymembers'] +catlist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(importcat)}&format=json&cmlimit=max", + uri_adapter: Addressable::URI).to_a[2][1]['categorymembers'] catlist.reject! { |cat| cat["ns"] != 14 } totalcontain = [] catlist.each do |cat| getcatmembers(cat["title"], fromwiki).each do |page| totalcontain.push(page) end end # Verifica e rientra nelle sottocategorie e nelle eventuali categorie più sommerse count = 0 totalcontain.each { |tc| count += 1 if tc["ns"] == 14} while(count > 0) totalcontain.each do |tc| if tc["ns"] == 14 getcatmembers(tc["title"], fromwiki).each do |page| totalcontain.push(page) end totalcontain.delete(tc) end end count = 0 totalcontain.each { |tc| count += 1 if tc["ns"] == 14} end # Effettua il login nell'api mediawiki client = MediawikiApi::Client.new importwiki client.log_in "#{userdata[0]}", "#{userdata[1]}" # Rimuove le voci già sul wiki dall'array totalcontain.reject! { |page| client.query(list: :search, srsearch: '"' + page["title"] + '"', srlimit: 1, srwhat: :title)["query"]["searchinfo"]["totalhits"] > 0} # Importa la voce nel wiki, funziona solo se c'è un interwiki a Wikipedia in Italiano con w, modificabile secondo necessità totalcontain.each do |page| puts "Importo pagina #{page["title"]}" begin client.action(:import, summary: "Importazione della pagina #{page["title"]} #CatImporterBot", interwikiprefix: userdata[4], interwikisource: userdata[4], interwikipage: page["title"], fullhistory: true, templates: true) rescue => e puts e puts "Pagina #{page["title"]} ha riscontrato un errore" end end