One Nice Bug Per Day

Product Placement
KIROKAZE
cherry valley forever
Keni
macklin celebrini has autism
🪼
tumblr dot com
noise dept.

shark vs the universe
Sweet Seals For You, Always
art blog(derogatory)
Show & Tell
YOU ARE THE REASON
Interview Vampire Daily
RMH

PR's Tumblrdome
Phantogram Three
I'd rather be in outer space 🛸

roma★

seen from Norway

seen from Bangladesh
seen from Spain
seen from Brazil
seen from Vietnam

seen from United States
seen from United States

seen from Singapore
seen from Türkiye
seen from India

seen from Chile
seen from Thailand

seen from Malaysia

seen from United Kingdom

seen from Uruguay
seen from Bangladesh

seen from Bangladesh
seen from Brazil
seen from United States
seen from Colombia
@yelyahwilliams-instagram
package ti;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern;
import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document;
import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.Collections2; import com.google.common.collect.Lists;
public class InstagramReplicator { public static InstagramReplicator newInstance(String instagramUser, String tumblrUser, String tagName) throws IOException { return new InstagramReplicator(instagramUser, tumblrUser, tagName); } public void doUpdate() throws IOException { System.out.println(“Checking for updates: instagramUser=” + instagramUser); for(String instagramUrl : loadInstagramUrls()) { if(!currentImages.contains(instagramUrl)) { submitPostToTumblr ( loadInstagramPost(instagramUrl) ); currentImages.add(instagramUrl); if(currentImages.size() > 100) { currentImages.remove(currentImages.get(0)); } } } } private List<String> loadInstagramUrls() throws IOException { List<String> instagramUrls = findMatches ( Jsoup.connect(“http://instagram.com/” + instagramUser).get().outerHtml(), ""link":"(http:\\/\\/instagram\.com\\/p\\/[^\\]*\\/)"“, true ); Collections.reverse(instagramUrls); //System.out.println(instagramUser + ” - “ + instagramUrls); return instagramUrls; } private Post loadInstagramPost(String postUrl) throws IOException { System.out.println("Loading post: postUrl=” + postUrl); String docText = Jsoup.connect(postUrl).get().outerHtml(); //System.out.println(“doctext=” + docText); String caption = “<p>” + findMatch(docText, “"caption":"(.*?[^\\])"”, false) + “</p>”; String tagRegEx = “#([A-Za-z0-9_]+)”; String userRegEx = “@([A-Za-z0-9_]+)”; List<String> tags = Lists.newArrayList(); tags.addAll(findMatches(caption, tagRegEx, false)); tags.addAll(findMatches(caption, userRegEx, false)); //caption = caption.replaceAll(tagRegEx, “<a href=\\"http://www.gramfeed.com/instagram/tags#$1\\">$0</a>”); caption = caption.replaceAll(userRegEx, “<a href=\\"http://instagram.com/$1\\">$0</a>”); if(docText.contains(“"is_video":true”)) { caption += “<p><a href=\"” + postUrl + “\">Watch Video</a></p>”; } return new Post ( postUrl, findMatch(docText, “"display_src":"([^"]*)"”, true), //imageUrl caption, Joiner.on(“,”).join(tags) ); } private void submitPostToTumblr(Post post) throws IOException { System.out.println(“Submitting post: post=” + post); try { HttpURLConnection connection = (HttpURLConnection) new URL(“http://www.tumblr.com/svc/post/update”).openConnection();
connection.setDoOutput(true); connection.setDoInput(true); connection.setInstanceFollowRedirects(false); connection.setRequestMethod(“POST”); connection.setRequestProperty(“Cookie”, tumblrCookie); connection.setRequestProperty(“X-tumblr-puppies”, getSecureFormKey()); connection.setRequestProperty(“X-tumblr-form-key”,“OdhVH6QQTBzl9IZZDViXwyj5vOU”); connection.setRequestProperty(“Origin”,“http://www.tumblr.com”); connection.setRequestProperty(“Accept-Encoding”,“gzip,deflate,sdch”); connection.setRequestProperty(“Host”,“www.tumblr.com”); connection.setRequestProperty(“Accept-Language”,“en-US,en;q=0.8”); connection.setRequestProperty(“User-Agent”,“Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36”); connection.setRequestProperty(“Content-Type”,“application/json”); connection.setRequestProperty(“Accept”,“application/json, text/javascript, */*; q=0.01”); connection.setRequestProperty(“Referer”,“http://www.tumblr.com/new/photo”); connection.setRequestProperty(“X-Requested-With”,“XMLHttpRequest”); connection.setRequestProperty(“Connection”,“keep-alive”); connection.setRequestProperty(“DNT”,“1”); connection.setUseCaches(false);
OutputStream output = connection.getOutputStream(); output.write ( (“{"form_key":"OdhVH6QQTBzl9IZZDViXwyj5vOU","context_id":"","context_page":"dashboard",” + “"editor_type":"rich","is_rich_text[one]":"0","is_rich_text[two]":"1","is_rich_text[three]":"0",” + “"channel_id":"” + tumblrUser + "","post[slug]":"",“ + ”"post[source_url]":"“ + post.postUrl + ”","post[date]":"","post[three]":"“ + post.postUrl + ”","MAX_FILE_SIZE":"10485760","post[type]":"photo",“ + ”"post[two]":"“ + post.caption + ”","post[tags]":"“ + Joiner.on(”,“).join(userTags, post.tags, instagramUser, "instagram”).replace(’_’, ’ ’) + "","post[publish_on]":"","post[state]":"0 3","post[photoset_layout]":"1","post[photoset_order]":"o1",“ + ”"images[o1]":"“ + post.imageUrl + ”","photo_src[]":"“ + post.imageUrl + ”"}“).getBytes(Charset.forName("UTF-8”)) ); output.close();
InputStream input = connection.getInputStream(); while(input.read() != -1) {}
System.out.println(“Post submission complete, httpStatusCode=” + connection.getResponseCode());
input.close(); } catch (IOException e) { if(consecutiveTumblrErrors++ > 10) { System.err.println(“FATAL: Too many consecutive tumblr failures, shutting down”); System.exit(1); } throw e; } consecutiveTumblrErrors = 0; } private String getSecureFormKey() throws IOException { Connection connection = Jsoup.connect(“http://www.tumblr.com/svc/secure_form_key”) .header(“Cookie”, tumblrCookie) .header(“X-tumblr-form-key”,“OdhVH6QQTBzl9IZZDViXwyj5vOU”) .header(“Origin”,“http://www.tumblr.com”) .header(“Accept-Encoding”,“gzip,deflate,sdch”) .header(“Host”,“www.tumblr.com”) .header(“Accept-Language”,“en-US,en;q=0.8”) .header(“User-Agent”,“Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36”) .header(“Content-Type”,“application/json”) .header(“Accept”,“application/json, text/javascript, */*; q=0.01”) .header(“Referer”,“http://www.tumblr.com/new/photo”) .header(“X-Requested-With”,“XMLHttpRequest”) .header(“Connection”,“keep-alive”) .header(“DNT”,“1”) .header(“Content-Length”, “0”); connection.post(); String secureFormKey = connection.response().header(“X-tumblr-secure-form-key”); System.out.println(“secureFormKey=” + secureFormKey);
return secureFormKey; }
private String findMatch(String string, String regex, boolean isUrl) { List<String> matches = findMatches(string, regex, isUrl); if(matches.isEmpty()) { return “”; } return matches.get(0); } private List<String> findMatches(String string, String regex, boolean isUrl) { Matcher matcher = Pattern .compile(regex) .matcher(string);
List<String> matches = Lists.newArrayList();
while(matcher.find()) { matches.add ( matcher .group(1) .replace ( (isUrl ? “\” : “”), “” ) ); }
return matches; } //nested classes private class Post { public Post(String postUrl, String imageUrl, String caption, String tags) { this.postUrl = postUrl; this.imageUrl = imageUrl; this.caption = caption; this.tags = tags; } @Override public String toString() { return “Post [postUrl=” + postUrl + “, imageUrl=” + imageUrl + “, caption=” + caption + “, tags=” + tags + “]”; }
private final String postUrl; private final String imageUrl; private final String caption; private final String tags; } //constructors
private InstagramReplicator(String instagramUser, String tumblrUser, String tagName) throws IOException { this.instagramUser = instagramUser; this.tumblrUser = tumblrUser; this.userTags = tagName; currentImages = loadInstagramUrls();
/* currentImages.removeAll ( Splitter .on(’,’) .trimResults() .omitEmptyStrings() .splitToList ( ) );*/
}
//attributes
private final String instagramUser; private final String tumblrUser; private final String userTags; private final List<String> currentImages;
//static
public static void main(String[] args) throws IOException { Executors.newScheduledThreadPool(0).scheduleWithFixedDelay ( new Runnable() { List<InstagramReplicator> replicators = Lists.newArrayList ( InstagramReplicator.newInstance(“willaaaahh”, “willaaaahhh”, “willa holland”), InstagramReplicator.newInstance(“emmaroberts”, “emmaroberts9”, “emma roberts”), InstagramReplicator.newInstance(“tfarm7”, “tfarm11”, “taissa farmiga”), InstagramReplicator.newInstance(“taylorswift”, “taylorswift26”, “taylor swift,taylorswift13”), InstagramReplicator.newInstance(“yelyahwilliams”, “yelyahwilliams-instagram”, “hayley williams”),
InstagramReplicator.newInstance(“MileyCyrus”, “mileycyrus-instagram”, “miley cyrus”), //InstagramReplicator.newInstance(“badgalriri”, “badgalriri-instagram”, “rihanna”), InstagramReplicator.newInstance(“beyonce”, “beyonce-instagram”, “beyonce knowles”), InstagramReplicator.newInstance(“caradelevingne”, “caradelevingne-instagram”, “cara delevingne”), InstagramReplicator.newInstance(“nickiminaj”, “nickiminaj-instagram”, “nicki minaj”), InstagramReplicator.newInstance(“emmyrossum”, “emmyrossum-instagram”, “emmy rossum”), InstagramReplicator.newInstance(“tigersjaw”, “tigersjaw-instagram”, “tigers jaw,brianna collins”), InstagramReplicator.newInstance(“tayjardine”, “tayjardine-instagram”, “tay jardine,taylor jardine,we are the in crowd”), InstagramReplicator.newInstance(“lordemusic”, “lordemusic-instagram”, “lorde”) );
Iterator<InstagramReplicator> replicatorIterator = replicators.iterator();
@Override public void run() { if(!replicatorIterator.hasNext()) { replicatorIterator = replicators.iterator(); }
InstagramReplicator replicator = replicatorIterator.next();
try { replicator.doUpdate(); } catch (Throwable e) { e.printStackTrace(); } } }, 0, 5, TimeUnit.SECONDS ); } private static int consecutiveTumblrErrors = 0; private static final String tumblrCookie = “”; }
Album · 2021 · 3 Songs
ready.
ARGENTINA WAITING
thanks for a good time, Dublin
found a job @tolavintage
18 and in the business of misery. #10yearsofRIOT
been waiting for the right time to post these thoughts on After Laughter. it's taken me about this long to truly let go [of the songs we made] 💙💛❤️ see you all so soon.
happy bday to this olive grin 🍸@bodegajonez
Bruce got some new art