For this task I suggest to use the [map matching project][1] (where I'm the author of)
With this project you can easily associate arbitrary GPS coordinates to edge IDs of GraphHopper. An edge is the connection between two junctions. And then you can use this to influence the routing of GraphHopper itself. I've blogged about the map matching [here][2] and also about the traffic influenced routing [here][3]. The problem you'll encounter is that you can get the edge IDs but not the OSM IDs and you'll have to take care when you re-import the data with fresh OSM data where the edge IDs will change. But as I've already done this several times I can say there are ways to make it working ;)
For the second part of your question I only have a partial answer. We've started to collect some (open) open/free data sources [here][4] where often e.g. only the traffic counts is available (not the flow or speed of the vehicles). Feel free to add your known sources and maybe make this more popular so that more people add their sources ;)
[1]: https://github.com/graphhopper/map-matching
[2]: https://karussell.wordpress.com/2015/05/26/map-matching-use-cases-or-why-an-open-source-and-open-data-alternative-is-superior-to-the-google-maps-roads-api/
[3]: https://karussell.wordpress.com/2015/04/08/visualize-and-handle-traffic-information-with-graphhopper-in-real-time-for-cologne-germany-koln/
[4]: https://github.com/graphhopper/open-traffic-collection