{"id":16671413,"url":"https://github.com/jacoby/faveharvest","last_synced_at":"2026-04-30T05:36:21.449Z","repository":{"id":21442804,"uuid":"24761106","full_name":"jacoby/FaveHarvest","owner":"jacoby","description":"Harvest Your Favorited Tweets.","archived":false,"fork":false,"pushed_at":"2014-10-03T17:04:20.000Z","size":144,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-19T17:37:12.608Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"artistic-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jacoby.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-10-03T14:20:54.000Z","updated_at":"2014-10-03T15:49:23.000Z","dependencies_parsed_at":"2022-08-05T12:15:18.213Z","dependency_job_id":null,"html_url":"https://github.com/jacoby/FaveHarvest","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacoby%2FFaveHarvest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacoby%2FFaveHarvest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacoby%2FFaveHarvest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacoby%2FFaveHarvest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jacoby","download_url":"https://codeload.github.com/jacoby/FaveHarvest/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243318748,"owners_count":20272137,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T11:44:24.175Z","updated_at":"2025-12-28T07:23:53.194Z","avatar_url":"https://github.com/jacoby.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"FaveHarvest\n===========\n\nHarvest Your Favorited Tweets.\n\nPrerequisites\n-------------\n\nThe setup I use stores tweet data using MySQL and Perl's MySQL library. Changes would \nbe necessary to use other engines, such as PostgreSQL or SQLite, but it shouldn't require \nmuch work.\n\nI use the feature \"say\", which works like \"print\" but appends a newline to the end of the\nline. This is a newer part of Perl, which requires a newer Perl than you might have. \nWithout stress-testing, I'd guess that this won't work with Perls older than 5.10, \nbut as the community supports only 5.16 and newer, I think, and the most recently \nreleased version is 5.20, this hopefully should not be a problem.\n\nMany of the modules I use are part of Perl's core and are distributed with Perl itself.\nDateTime, DBI, IO::Interactive, LWP::UserAgent, Net::Twitter, and YAML. You can use\neither CPAN or your distribution's package manager to install these modules.\n\nConfiguration\n-------------\n\nBecause Twitter uses OAuth for their authentication, you need to get your own \nConsumer Key and Secret from Twitter at https://apps.twitter.com/. The Consumer \nKey is control at the application level, and each twitter feed you harvest for \nfavorites will have it's own token set as well. These are the first lines of your\n.twitter.cnf file. I have included a sample .twitter.cnf file.\n\nThe first time you use this tool with a given user, it will not start the harvest,\nbut instead it will set up and store the OAuth keys. This will require a web browser\nwhere you are logged in to Twitter as the user desired.\n\nBecause I hate having usernames and passwords in my code, and I want to make the \nmy interaction with databases as simple as possible, I have written two modules,\nDB.pm and MyDB.pm, which are in the lib directory of this but should be in your\n$ENV{HOME}/lib directory. This uses YAML to store the access information. A sample\nmy.yaml file is included as well.\n\nThe database schema I use is also included as twitter_favorites.sql.\n\nUsage\n-----\n\n    twitter_favorites.pl -u \u003cscreen_name_without_at_sign\u003e\n\n    twitter_favorites_harvester.pl -u \u003cscreen_name_without_at_sign\u003e\n\n\nThere are two bundled programs: twitter_favorites.pl and twitter_favorites_harvester.pl.\nThe main difference is that favorites starts at the top of list and exits if it finds an\nalready-entered favorite tweet, while harvester will go until it's hit the end of the \nlist, skipping past already-entered favorite tweets.\n\nTwitter rate-limits access to it's APIs in an attempt to keep the fail whale at bay, so \nmy program only picks up a new set of up to 20 favorites every five minutes.\n\nData\n----\n\nYour data is stored in your database. Getting it out like in the form you need it is\nup to you.\n\nYou can use the following query, for example, to list your top ten favorited twitter\nusers:\n\n    select user_screen_name screen_name \n        , count(*) count \n    from twitter_favorites \n    group by screen_name \n    order by count \n    desc limit 10\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacoby%2Ffaveharvest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacoby%2Ffaveharvest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacoby%2Ffaveharvest/lists"}