From fec31cedcca3fbe958ff658b7c961fac81da57bf Mon Sep 17 00:00:00 2001 From: Hexaitos Date: Wed, 13 Nov 2024 23:20:15 +0100 Subject: [PATCH] Add WIP file that saves files locally as well (json and jpg). --- .gitignore | 3 +- local.rb | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 local.rb diff --git a/.gitignore b/.gitignore index 2eea525..ad60b67 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +data/ \ No newline at end of file diff --git a/local.rb b/local.rb new file mode 100644 index 0000000..3c38f6c --- /dev/null +++ b/local.rb @@ -0,0 +1,121 @@ +#!/usr/bin/ruby + +=begin +This file is part of Bot of Prey. + +Bot of Prey 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. + +Bot of Prey 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 Foobar. If not, see . + +Author: Hexaitos (me@hexaitos.com, me@bateleur.org) +=end + +require 'dotenv/load' +require 'fileutils' +require 'open-uri' +require 'time' +require 'net/http' +require 'json' +require 'uri' +require 'faraday' +require 'faraday/multipart' +require 'down' +require 'marcel' +require 'sanitize' + +auth_token = ENV['API_KEY'] +instance_url = ENV['INSTANCE_URL'] +bird_api_url = ENV['BIRD_API_URL'] +save_locally = ENV['SAVE_LOCALLY'] +path_to_data = ENV['PATH_TO_DATA'] + +current_time = Time.now +year = current_time.year +month = current_time.month.to_s.rjust(2, '0') +day = current_time.day.to_s.rjust(2, '0') +time = current_time.strftime("%H%M") + +conn = Faraday.new(url: bird_api_url) do |faraday| + faraday.adapter Faraday.default_adapter +end + +response = conn.get + +data = JSON.parse(response.body) +puts "Data received from bird API: #{data}" +user, url, thumb, license, desc, license_url, user_url = data.values_at('user', 'url', 'thumb', 'license', 'desc', 'license_url', 'user_url') + +uri = URI.parse(url) +filename = File.basename(uri.path) +folder_path = "#{path_to_data}/json/#{year}/#{month}/#{day}/#{time}" + +FileUtils.mkpath(folder_path) +puts "Folder created at: #{folder_path}" + +File.open("#{folder_path}/#{filename}.json", 'w') do |file| + file.write(data.to_json) +end + +desc_sanitised = Sanitize.clean(desc) + +status = "#{desc}\n\n**Attribution and license**: #{user} (#{license})\n**Source**: #{url}" +puts "Status for post: #{status}" + +folder_path = "#{path_to_data}/imgs/#{year}/#{month}/#{day}/#{time}" +FileUtils.mkpath(folder_path) +puts "Folder created at: #{folder_path}" + +image = "#{folder_path}/#{filename}" + +URI.open(url) do |picture| + File.open(image, 'wb') do |file| + file.write(picture.read) + end +end + +image_mime = Marcel::MimeType.for Pathname.new(image) + +conn = Faraday.new( + url: "#{instance_url}", + headers: {'Content-Type' => 'multipart/form-data'} +) do |faraday| + faraday.request :multipart + faraday.adapter Faraday.default_adapter +end + +file = Faraday::Multipart::FilePart.new( + image, image_mime +) + +response = conn.post('/api/v2/media') do |req| + req.headers['Authorization'] = "Bearer #{auth_token}" + req.body = { + file: file, + description: "A photo of a bird of prey taken from Wikimedia Commons. The photo was described as follows by the original uploader or creator: #{desc_sanitised}" + } +end + +puts "Response received after media upload: #{response.status}" +parsed_response = JSON.parse(response.body) +media_id = parsed_response["id"] + +conn = Faraday.new( + url: "#{instance_url}", + headers: {'Content-Type' => 'multipart/form-data'} +) do |faraday| + faraday.request :multipart + faraday.adapter Faraday.default_adapter +end + +response = conn.post('/api/v1/statuses') do |req| + req.headers['Authorization'] = "Bearer #{auth_token}" + req.body = { + 'status' => status, + 'visibility' => 'public', + 'media_ids[]' => media_id + } +end + +puts "Reponse received from server after posting status: #{JSON.parse(response.body)}" \ No newline at end of file