[{"data":1,"prerenderedAt":372},["ShallowReactive",2],{"project-6810458":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":42,"post_text":45,"what":46,"said":95,"maker_in_thread":182,"shape":192,"grid":196,"attempts":335,"same_week":336,"maker_shows":44,"maker_hidden":364,"reader_version":365,"card":366},"6810458","Gmail.js","JavaScript API for Gmail","title","Show HN: Gmail.js – JavaScript API for Gmail","https:\u002F\u002Fgithub.com\u002FKartikTalwar\u002Fgmail.js","github.com","kartikt",1385580391,2013,212,56,64,1739,4,"notable","dev_tools","browser extension library","library",[24,25,26,27],"gmail api","javascript","chrome extension","gmail dom","mixed",0.176,{"positive":31,"neutral":32,"mixed":33,"critical":34},9,13,3,6,31,{"idea":37,"execution":38,"docs":41},{"positive":34,"critical":18},{"positive":39,"critical":40},0,2,{"positive":39,"critical":39},[39,39,39,39,39,43,39,33,39,33,33,33,44,39,33,44,44,44,33,43,39,33,43,39,43,33,39,43,39,43,33,39,39,39,33,39,33,43,33,33],5,1,null,{"problem":47,"audience":63,"pricing":45,"motivation":70,"time_to_build":45,"stack":76,"openness":93,"stage":94,"team_size":94},{"value":48,"source":49,"evidence":50},"Gmail's UI changes break extensions that scrape its DOM","commenter",[51,55,59],{"id":52,"by":53,"text":54},"6810975","grinich","Unfortunately this type of hacking isn't really sustainable. Even small tweaks to the Gmail UI often change the DOM in very unpredictable ways. When they released the new compose…",{"id":56,"by":57,"text":58},"6810669","gkoberger","It would be amazing if this were a service. Easier said than done, I know -- but, basically this but have it check a JSON file every few hours and gets the updated selectors.…",{"id":60,"by":61,"text":62},"6810600","abentspoon","First, yes, this is really cool. However, it's even worse than you think. It's making a lot of references to minified\u002Fobfuscated names. Things like $('.nH.hx'). When I was…",{"value":64,"source":65,"evidence":66},"Chrome extension developers building on Gmail","maker",[67],{"id":68,"by":11,"text":69},"6811515","SMTP? Never heard of it. This library is more for developing chrome extensions that take advantage of gmail's DOM and UI state",{"value":71,"source":65,"evidence":72},"Reduce duplicated effort for Gmail extension developers",[73],{"id":74,"by":11,"text":75},"6811181","Thanks for your feedback. I agree, which is why i decided to put it out there because I use the library in a chrome extension and if something breaks, I would be trying to get…",[77,82],{"value":78,"source":79,"evidence":80},"JavaScript","inferred",[81],{"id":60,"by":61,"text":62},{"value":83,"source":49,"evidence":84},"jQuery",[85,89],{"id":86,"by":87,"text":88},"6811624","tericho","Thanks for making the library, glad to see you put lots of time into the docs too. Hopefully the can of worms you've opened doesn't drive you crazy, personally I would've stopped…",{"id":90,"by":91,"text":92},"6811842","nilliams","To be fair, that's a pretty odd way to write jQuery, which is designed to be chained. It could be rewritten as: ``` $('.nH .if') .children().eq(1) .children() .children().eq(1)…","open_source","unknown",{"praise":96,"objections":109,"requests":124,"questions":144,"alternatives":152},[97],{"value":98,"source":49,"evidence":99},"Clever and well-built library with good docs",[100,104,105],{"id":101,"by":102,"text":103},"6810538","untog","Interesting - and a very good job given what you have to work with. Surely its incredibly brittle, though? As soon as they release a new version of Gmail it's going to fail. But…",{"id":86,"by":87,"text":88},{"id":106,"by":107,"text":108},"6811921","andymitchell","As I understand, from one of the early Gmail product managers, element class names are the most stable of all the 'fingerprints'. The Javascript data structures are quite stable,…",[110,119],{"value":111,"source":49,"evidence":112},"Selectors are minified class names that change often, so it is brittle",[113,114,118],{"id":60,"by":61,"text":62},{"id":115,"by":116,"text":117},"6810779","Griever","Yeah, the strange selector names that never cease to change were what ultimately caused me to abandon my relatively popular Chrome extension \"Gmail Attachments to Drive\". Having…",{"id":101,"by":102,"text":103},{"value":120,"source":49,"evidence":121},"Browser add-on review makes fast fixes hard",[122,123],{"id":56,"by":57,"text":58},{"id":106,"by":107,"text":108},[125,133],{"value":126,"source":49,"evidence":127},"Hosted selector JSON or shared maintenance so breakages get fixed faster",[128,129],{"id":56,"by":57,"text":58},{"id":130,"by":131,"text":132},"6814320","ma2rten","Maybe it could just be a JSON file with the xpath of all important elements? Also maybe it doesn't really have to be a service. It could just be a file on github, where anyone…",{"value":134,"source":49,"evidence":135},"Observer event for when an email is opened",[136,140],{"id":137,"by":138,"text":139},"6813588","zrgiu_","I'd love to use this but I can't figure out what's the action\u002Fevent for when I open an email to read it. I'm sure it's there, I just can't see it ..",{"id":141,"by":142,"text":143},"6810837","typpo","This is pretty useful. A couple months ago I started making a free self-hosted version of Boomerang for Gmail, but lost interest because I felt like I would have to devote most…",[145],{"value":146,"source":49,"evidence":147},"Why use DOM instead of Gmail's API calls",[148],{"id":149,"by":150,"text":151},"6812878","driverdan","I'm curious why you'd use the DOM instead of making API calls to the server. If Google can do it as part of their UI surely a 3rd party script can too. Is the API more complex…",[153,164,168,175],{"value":154,"source":49,"evidence":155},"gmailr by James Yu",[156,160],{"id":157,"by":158,"text":159},"6811665","catmanjan","These projects are already pretty advanced versions of this: https:\u002F\u002Fgithub.com\u002Fjamesyu\u002Fgmailr and https:\u002F\u002Fgithub.com\u002Fjoscha\u002Fgmailui In fact gmailr is used in \"Cloudy\" - one of…",{"id":161,"by":162,"text":163},"6811408","jamesjyu","Author of Gmailr here, which apparently inspired this project. Kudos! Glad to see someone taking the ball and running with it. I haven't had time to update Gmailr lately, as it…",{"value":165,"source":49,"evidence":166},"gmailui by Joscha",[167],{"id":157,"by":158,"text":159},{"value":169,"source":49,"evidence":170},"Gmail IMAP\u002FSMTP",[171],{"id":172,"by":173,"text":174},"6811428","advisedwang","Did you know there is a remote API for Gmail which is compatible with Exchange, Outlook.com, yahoo mail and every other mail provider out there? It's called IMAP\u002FSMTP!",{"value":176,"source":49,"evidence":177},"Streak API",[178],{"id":179,"by":180,"text":181},"6810798","jorgem","Similar in some ways to api that is in streak.com",{"comments":183,"answered":43,"key":184},14,[185,186,189],{"id":74,"text":75},{"id":187,"text":188},"6810708","Neat suggestion. It could totally be uploaded to a cdn where people can simply import it and once a change occurs on Gmail and the script gets updated, everybody benefits.",{"id":190,"text":191},"6812110","Thank you Andy!",{"commenters":193,"max_depth":43,"maker_replies":183,"first_comment_mins":194,"lifespan_hours":195},36,11,23,[197,199,201,204,207,210,214,218,220,221,224,227,229,233,236,239,242,245,247,249,250,251,253,254,256,258,259,260,262,265,266,268,272,274,276,279,281,284,287,291,293,296,299,302,304,306,308,309,312,315,317,319,323,325,329,331],[52,39,39,198,53,39],"commenter\u002Fneutral\u002Fidea",[74,39,39,200,11,44],"maker\u002Fneutral\u002Fidea",[202,39,39,203,53,39],"6813480","commenter\u002Fneutral\u002Fexecution",[205,39,39,198,206,39],"6811650","znowi",[208,39,39,198,209,39],"6811776","andreasklinger",[211,39,39,212,213,39],"6811767","commenter\u002Fneutral\u002Fnone","alexjeffrey",[215,39,39,216,217,39],"6813995","other\u002Fneutral\u002Fexecution","hugofirth",[56,44,43,219,57,39],"project\u002Fpositive\u002Fidea",[187,44,39,219,11,44],[222,44,33,223,57,39],"6810748","project\u002Fneutral\u002Fexecution",[225,44,33,223,226,39],"6811071","joshuacc",[228,44,39,203,57,39],"6811102",[230,44,44,231,232,39],"6810829","project\u002Fcritical\u002Fidea","loceng",[234,44,43,219,235,39],"6811644","csallen",[237,44,33,238,232,39],"6814777","project\u002Fneutral\u002Fidea",[240,44,33,238,241,39],"6812178","yeukhon",[243,44,44,231,244,39],"6814353","Hurdy",[106,44,33,246,107,39],"project\u002Fmixed\u002Fexecution",[190,44,39,248,11,44],"maker\u002Fpositive\u002Fnone",[130,44,33,223,131,39],[101,40,33,246,102,39],[60,40,44,252,61,39],"project\u002Fcritical\u002Fexecution",[115,40,44,252,116,39],[255,40,44,231,244,39],"6811109",[257,40,44,231,116,39],"6811381",[86,33,33,246,87,39],[90,33,39,203,91,39],[161,18,43,261,162,39],"maker\u002Fpositive\u002Fidea",[263,18,39,264,11,44],"6811557","maker\u002Fpositive\u002Fexecution",[149,43,33,223,150,39],[267,43,39,223,11,44],"6812891",[269,34,43,270,271,39],"6812190","project\u002Fpositive\u002Fnone","xpressyoo",[273,34,39,270,11,44],"6812415",[141,275,43,219,142,39],7,[277,275,39,278,11,44],"6811137","project\u002Fneutral\u002Fnone",[157,280,33,238,158,39],8,[282,280,39,283,11,44],"6811731","maker\u002Fneutral\u002Fnone",[285,31,33,223,286,39],"6811252","togasystems",[288,289,43,248,290,39],"6813069",10,"rohitv",[292,289,39,248,11,44],"6813076",[294,194,43,219,295,39],"6810553","gailees",[297,194,43,219,298,39],"6810679","ten7",[137,300,33,301,138,39],12,"project\u002Fneutral\u002Fdocs",[303,300,39,223,11,44],"6815484",[172,32,39,305,173,39],"commenter\u002Fcritical\u002Fidea",[307,32,39,198,235,39],"6811485",[68,32,39,200,11,44],[310,32,39,203,311,39],"6811522","OGC",[313,183,33,278,314,39],"6810785","sumit_psp",[316,183,39,270,11,44],"6810828",[179,318,33,238,180,39],15,[320,321,43,270,322,39],"6813793",16,"melpomene",[324,321,39,248,11,44],"6815316",[326,327,33,283,328,39],"6811372",17,"kirbyk",[330,327,39,283,11,44],"6811398",[332,333,33,238,334,39],"6815691",18,"pknerd",[],[337,341,346,350,355,360],{"id":338,"name":339,"points":340,"category":20},"6775447","Watson",156,{"id":342,"name":343,"points":344,"category":345},"6793495","Meet Sid",133,"hardware",{"id":347,"name":348,"points":349,"category":20},"6776168","Omniref",110,{"id":351,"name":352,"points":353,"category":354},"6790511","Bit of News",95,"productivity",{"id":356,"name":357,"points":358,"category":359},"6776269","Devils in Heaven",58,"games",{"id":361,"name":362,"points":363,"category":354},"6774413","JanusNotes",53,false,"v2",{"id":367,"name":5,"line":6,"ai":364,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":368,"top":18,"kw":369,"maker":11,"domain":10,"tier":19,"attempts":39,"strip":370,"url":9,"mix":371,"praise":98,"objection":111,"sub":21},6810458,0.18,[24,25,26,27],"0000050303331031113503505305053000303533",[31,32,33,34],1793990900320]